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

Artifact 867cab23c0577d4ac0510c925a85b8e032cfe139:


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 37 35  select.c,v 1.175
0200: 20 32 30 30 34 2f 30 35 2f 32 35 20 32 33 3a 33   2004/05/25 23:3
0210: 35 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  5:19 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
0250: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0260: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0270: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0280: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0290: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
02a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
02b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
02c0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
02d0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
02e0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
02f0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0300: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0310: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0320: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0330: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0340: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0350: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0360: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0370: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0380: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0390: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
03a0: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
03b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
03c0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
03d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
03e0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
03f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0400: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c   int isDistinct,
0410: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69         /* true i
0420: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0430: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0440: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6d 69  t */.  int nLimi
0450: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
0460: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 2d 31  LIMIT value.  -1
0470: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0480: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74  */.  int nOffset
0490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46             /* OF
04a0: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 30 20 6d  FSET value.  0 m
04b0: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
04c0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
04d0: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
04e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
04f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
0500: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0520: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
0530: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0540: 69 73 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b  istDelete(pSrc);
0550: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0560: 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a  Delete(pWhere);.
0570: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0580: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0590: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
05a0: 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69  ExprDelete(pHavi
05b0: 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
05c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
05d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73  OrderBy);.  }els
05e0: 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e{.    if( pELis
05f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  t==0 ){.      pE
0600: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
0610: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0620: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
0630: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0640: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70     }.    pNew->p
0650: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0660: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
0670: 20 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d   pSrc;.    pNew-
0680: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
0690: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
06a0: 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
06b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  .    pNew->pHavi
06c0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
06d0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
06e0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
06f0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
0700: 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a  t = isDistinct;.
0710: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54      pNew->op = T
0720: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e  K_SELECT;.    pN
0730: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69  ew->nLimit = nLi
0740: 6d 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  mit;.    pNew->n
0750: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
0760: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  ;.    pNew->iLim
0770: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65  it = -1;.    pNe
0780: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
07a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
07b0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
07c0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
07d0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
07e0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
07f0: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0800: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0810: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0820: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0830: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0840: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0850: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0860: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0870: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
0880: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0890: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
08a0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
08b0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
08c0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
08d0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
08e0: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
08f0: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0900: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0910: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0920: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0930: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0940: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0950: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0960: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0970: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0980: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0990: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
09a0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
09b0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
09c0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
09d0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
09e0: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
09f0: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74   *p;.  static st
0a00: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
0a10: 20 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b   char *zKeyword;
0a20: 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  .    int nChar;.
0a30: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
0a40: 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b  } keywords[] = {
0a50: 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22  .    { "natural"
0a60: 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20  , 7, JT_NATURAL 
0a70: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c  },.    { "left",
0a80: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a90: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0aa0: 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a   "right",   5, J
0ab0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0ac0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0ad0: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0ae0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0af0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65  R },.    { "oute
0b00: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45  r",   5, JT_OUTE
0b10: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65  R },.    { "inne
0b20: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  r",   5, JT_INNE
0b30: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73  R },.    { "cros
0b40: 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  s",   5, JT_INNE
0b50: 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  R },.  };.  int 
0b60: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
0b70: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
0b80: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
0b90: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
0ba0: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
0bb0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
0bc0: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
0bd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65   for(j=0; j<size
0be0: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0bf0: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
0c10: 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73  ( p->n==keywords
0c20: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
0c30: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
0c40: 74 72 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65  trNICmp(p->z, ke
0c50: 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f  ywords[j].zKeywo
0c60: 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  rd, p->n)==0 ){.
0c70: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
0c80: 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e   |= keywords[j].
0c90: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
0ca0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
0cb0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69   }.    if( j>=si
0cc0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73  zeof(keywords)/s
0cd0: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30  izeof(keywords[0
0ce0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  ]) ){.      join
0cf0: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
0d00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0d10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
0d20: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
0d30: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
0d40: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
0d50: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
0d60: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
0d70: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
0d80: 20 20 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e      static Token
0d90: 20 64 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20   dummy = { 0, 0 
0da0: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70  };.    char *zSp
0db0: 31 20 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d  1 = " ", *zSp2 =
0dc0: 20 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42   " ";.    if( pB
0dd0: 3d 3d 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d  ==0 ){ pB = &dum
0de0: 6d 79 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a  my; zSp1 = 0; }.
0df0: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
0e00: 20 70 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53   pC = &dummy; zS
0e10: 70 32 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71  p2 = 0; }.    sq
0e20: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
0e30: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0e40: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
0e50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e60: 79 70 65 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20  ype: ", 0,.     
0e70: 20 20 70 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20    pA->z, pA->n, 
0e80: 7a 53 70 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20  zSp1, 1, pB->z, 
0e90: 70 42 2d 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20  pB->n, zSp2, 1, 
0ea0: 70 43 2d 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29  pC->z, pC->n, 0)
0eb0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
0ec0: 72 72 2b 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  rr++;.    jointy
0ed0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0ee0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0ef0: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f20: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f30: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f40: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f50: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f70: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0f80: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fb0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fc0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0fd0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
0fe0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
0ff0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1000: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1010: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1020: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1030: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1050: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1070: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1080: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1090: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
10c0: 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52  term to the WHER
10d0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  E expression in 
10e0: 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71  *ppExpr that req
10f0: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f  uires the.** zCo
1100: 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65  l column to be e
1110: 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20  qual in the two 
1120: 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64  tables pTab1 and
1130: 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69   pTab2..*/.stati
1140: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1150: 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  erm(.  const cha
1160: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  r *zCol,        
1170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1180: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
1190: 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20   Table *pTab1,  
11a0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62      /* First tab
11b0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  le */.  const Ta
11c0: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
11d0: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
11e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
11f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
1200: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
1210: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1220: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
1230: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1240: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1250: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1260: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1270: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1280: 70 45 3b 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d  pE;..  dummy.z =
1290: 20 7a 43 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e   zCol;.  dummy.n
12a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b   = strlen(zCol);
12b0: 0a 20 20 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30  .  dummy.dyn = 0
12c0: 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ;.  pE1a = sqlit
12d0: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
12e0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70   0, &dummy);.  p
12f0: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  E2a = sqlite3Exp
1300: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
1310: 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d 79 2e  dummy);.  dummy.
1320: 7a 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  z = pTab1->zName
1330: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1340: 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20  rlen(dummy.z);. 
1350: 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 45   pE1b = sqlite3E
1360: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1370: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d   &dummy);.  dumm
1380: 79 2e 7a 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61  y.z = pTab2->zNa
1390: 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20  me;.  dummy.n = 
13a0: 73 74 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b  strlen(dummy.z);
13b0: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
13c0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
13d0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45  0, &dummy);.  pE
13e0: 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1c = sqlite3Expr
13f0: 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70  (TK_DOT, pE1b, p
1400: 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20  E1a, 0);.  pE2c 
1410: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1420: 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61  _DOT, pE2b, pE2a
1430: 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c  , 0);.  pE = sql
1440: 69 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20  ite3Expr(TK_EQ, 
1450: 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a  pE1c, pE2c, 0);.
1460: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1470: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
1480: 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70 45 78 70  n);.  if( *ppExp
1490: 72 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  r ){.    *ppExpr
14a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14b0: 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72 2c 20  K_AND, *ppExpr, 
14c0: 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pE, 0);.  }else{
14d0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
14e0: 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
14f0: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
1500: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
1510: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1520: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1530: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1540: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1550: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1560: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1570: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1580: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1590: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
15a0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
15b0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
15c0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
15d0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
15e0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
15f0: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
1600: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
1610: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
1620: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
1630: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
1640: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
1650: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1660: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
1670: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
1680: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1690: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
16a0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
16b0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
16c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
16d0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
16e0: 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  pr *p){.  while(
16f0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
1700: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
1710: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73  FromJoin);.    s
1720: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
1730: 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  eft);.    p = p-
1740: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
1750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1760: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
1770: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
1780: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
1790: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
17a0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
17b0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
17c0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
17d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
17e0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
17f0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
1800: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
1810: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1830: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
1840: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
1850: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
1860: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
1870: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
1880: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1890: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
18a0: 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  *pSrc;.  int i, 
18b0: 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  j;.  pSrc = p->p
18c0: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
18d0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i<pSrc->nSrc-1; 
18e0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
18f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1900: 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Term = &pSrc->a[
1910: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
1920: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 74  rcList_item *pOt
1930: 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  her = &pSrc->a[i
1940: 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  +1];..    if( pT
1950: 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20  erm->pTab==0 || 
1960: 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d 30 20  pOther->pTab==0 
1970: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1980: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
1990: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
19a0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
19b0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
19c0: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
19d0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
19e0: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
19f0: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
1a00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1a10: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1a20: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
1a30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1a40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1a50: 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 55 73  On || pTerm->pUs
1a60: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
1a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a80: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
1a90: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
1aa0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
1ab0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
1ac0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
1ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1af0: 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61 62  ab = pTerm->pTab
1b00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1b10: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1b30: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74   columnIndex(pOt
1b40: 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62 2d  her->pTab, pTab-
1b50: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3e  >aCol[j].zName)>
1b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b70: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54 61  addWhereTerm(pTa
1b80: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1b90: 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  , pTab, pOther->
1ba0: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
1bb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bd0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
1be0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1bf0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1c00: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
1c10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1c20: 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e   && pTerm->pUsin
1c30: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1c40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c50: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c60: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c70: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c80: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c90: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1cb0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1cc0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cd0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1ce0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cf0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1d00: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1d10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d20: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d30: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d40: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d50: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d70: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d80: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d90: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1da0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1db0: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1dc0: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1dd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1de0: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1df0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1e00: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1e10: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1e20: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1e30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1e40: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1e50: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1e60: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1e70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1e80: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1e90: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1ea0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1eb0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1ec0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1ed0: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1ee0: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1ef0: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1f00: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1f10: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1f20: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1f30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1f40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1f50: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1f60: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1f70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1f80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1f90: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1fa0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1fb0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1fc0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1fd0: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1fe0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1ff0: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
2000: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
2010: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
2020: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2030: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
2040: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
2050: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
2060: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
2070: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
2080: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
2090: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
20a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20c0: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
20d0: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
20e0: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
20f0: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2100: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2110: 65 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  es", pList->a[j]
2120: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
2130: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2150: 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73  ddWhereTerm(pLis
2160: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[j].zName, p
2170: 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68  Term->pTab, pOth
2180: 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57  er->pTab, &p->pW
2190: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
21a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
21c0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
21d0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
21e0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
21f0: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
2200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2210: 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74  ectDelete(Select
2220: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2230: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2240: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2250: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
2260: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2270: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
2280: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2290: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
22c0: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
22d0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
22e0: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
22f0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2300: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2310: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2320: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
2330: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
2340: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2350: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
2360: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67  ** Delete the ag
2370: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2380: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ion from the par
2390: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
23a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
23b0: 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
23c0: 52 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61  Reset(Parse *pPa
23d0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  rse){.  sqliteFr
23e0: 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29  ee(pParse->aAgg)
23f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
2400: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2410: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
2420: 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
2430: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2440: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2450: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2460: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2470: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2480: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2490: 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  er..**.** FIX ME
24a0: 3a 20 20 43 68 61 6e 67 65 20 74 68 69 73 20 73  :  Change this s
24b0: 6f 20 74 68 61 74 20 69 74 20 75 73 65 73 20 74  o that it uses t
24c0: 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 6f 70  he OP_MakeKey op
24d0: 63 6f 64 65 0a 2a 2a 20 69 6e 73 74 65 61 64 20  code.** instead 
24e0: 6f 66 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65  of OP_SortMakeKe
24f0: 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 4f  y.  Delete the O
2500: 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 20 6f 70  P_SortMakeKey op
2510: 63 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 63 6f 6c  code..** All col
2520: 75 6d 6e 73 20 73 68 6f 75 6c 64 20 68 61 76 65  umns should have
2530: 20 61 66 66 69 6e 69 74 79 20 4e 4f 4e 45 2e 20   affinity NONE. 
2540: 20 48 61 6e 64 6c 65 20 41 53 43 20 76 65 72 73   Handle ASC vers
2550: 75 73 0a 2a 2a 20 44 45 53 43 20 73 6f 72 74 20  us.** DESC sort 
2560: 6f 72 64 65 72 20 62 79 20 64 65 66 69 6e 69 6e  order by definin
2570: 67 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6d 70  g a list of comp
2580: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 73  arison functions
2590: 20 74 6f 0a 2a 2a 20 62 65 20 75 73 65 64 20 62   to.** be used b
25a0: 79 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70  y the OP_Sort op
25b0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25c0: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
25d0: 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
25e0: 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72  e, Vdbe *v, Expr
25f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b  List *pOrderBy){
2600: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2610: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
2620: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2630: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2640: 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  e(pParse, pOrder
2650: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2660: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
2670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
2680: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
2690: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
26a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
26b0: 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c  , OP_SortPut, 0,
26c0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
26d0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
26e0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
26f0: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2700: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2710: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2720: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2730: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2740: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2750: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2760: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2770: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2780: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2790: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
27a0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
27b0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
27c0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
27d0: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
27e0: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
27f0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2800: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2810: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2820: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2830: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2850: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2860: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2880: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2890: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
28a0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
28b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
28c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
28d0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
28e0: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
28f0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2900: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2910: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2920: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2930: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2950: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2960: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2970: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2980: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2990: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
29a0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
29b0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
29c0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
29d0: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
29e0: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
29f0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2a00: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2a10: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2a20: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2a30: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2a40: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2a50: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2a60: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2a70: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2a80: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2a90: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2aa0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2ab0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2ac0: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2ae0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2af0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2b00: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
2b10: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
2b20: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
2b30: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
2b40: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
2b50: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2b60: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2b70: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d  nt i;..  if( v==
2b80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2b90: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
2ba0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
2bb0: 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20  ere was a LIMIT 
2bc0: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45  clause on the SE
2bd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
2be0: 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63  then do the chec
2bf0: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
2c00: 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64   this row should
2c10: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
2c20: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
2c30: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
2c40: 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20  >iOffset>=0 ){. 
2c50: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
2c60: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2c70: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c90: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2ca0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2cb0: 72 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+2);.      sqli
2cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2cd0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2ce0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
2cf0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
2d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2d10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2d20: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
2d30: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
2d40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2d50: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
2d60: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
2d70: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
2d80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2d90: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
2da0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
2dc0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
2dd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2de0: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
2df0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
2e00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
2e10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2e20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2e40: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
2e50: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2e60: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
2e70: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
2e80: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
2e90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ea0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
2eb0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
2ec0: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
2ed0: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
2ee0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
2ef0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
2f00: 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74  /.  if( distinct
2f10: 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26 26  >=0 && pEList &&
2f20: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
2f30: 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57   ){.#if NULL_ALW
2f40: 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20  AYS_DISTINCT.   
2f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f60: 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  p(v, OP_IsNull, 
2f70: 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  -pEList->nExpr, 
2f80: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f90: 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23 65  ntAddr(v)+7);.#e
2fa0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65 6c 69  ndif.    /* Deli
2fb0: 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65 20 74  berately leave t
2fc0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
2fd0: 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 66 6f  ng off of the fo
2fe0: 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 4b  llowing OP_MakeK
2ff0: 65 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ey */.    sqlite
3000: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3010: 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74  _MakeKey, pEList
3020: 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  ->nExpr, 1);.   
3030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3040: 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74  p(v, OP_Distinct
3050: 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69  , distinct, sqli
3060: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3070: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71  dr(v)+3);.    sq
3080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3090: 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74  , OP_Pop, pEList
30a0: 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20  ->nExpr+1, 0);. 
30b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30c0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
30d0: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
30e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3100: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
3110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3120: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64   OP_PutStrKey, d
3130: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d  istinct, 0);.  }
3140: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
3150: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
3160: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
3170: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
3180: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
3190: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
31a0: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
31b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
31c0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
31d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
31f0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3200: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3210: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
3220: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3230: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
3240: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
3250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3260: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3270: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3280: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3290: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50  OP_PutStrKey, iP
32a0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
32b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
32c0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
32d0: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
32e0: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
32f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3300: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
3310: 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62  case SRT_TempTab
3320: 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  le: {.      sqli
3330: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3340: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3350: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3360: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
3370: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
3380: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
3390: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
33a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
33d0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
33e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
33f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3400: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
3410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3420: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
3430: 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tKey, iParm, 0);
3440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3450: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3460: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
3470: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
3480: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
3490: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
34a0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
34b0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
34c0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
34d0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
34e0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
34f0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
3500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3510: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
3520: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
3530: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
3540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3550: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3560: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3570: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3590: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
35a0: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
35b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
35d0: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
35e0: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
35f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3600: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
3610: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3620: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3630: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
3640: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
3650: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
3660: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
3670: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
3680: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
3690: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
36a0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
36b0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
36c0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
36d0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
36e0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
36f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
3700: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
3710: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3720: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3730: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3740: 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  2;..      assert
3750: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
3780: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b  Null, -1, addr1+
3790: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
37a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
37b0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
37c0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
37d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
37e0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
37f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
3800: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
3810: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3820: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3830: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3840: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
3850: 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20 20  t *affStr;.     
3860: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69     char aff = (i
3870: 50 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a  Parm>>16)&0xFF;.
3880: 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71          aff = sq
3890: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
38a0: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
38b0: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
38c0: 20 20 20 20 20 20 20 61 66 66 53 74 72 20 3d 20         affStr = 
38d0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 53  sqlite3AffinityS
38e0: 74 72 69 6e 67 28 61 66 66 29 3b 0a 20 20 20 20  tring(aff);.    
38f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
3900: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  p3(v, OP_MakeKey
3910: 2c 20 31 2c 20 30 2c 20 61 66 66 53 74 72 2c 20  , 1, 0, affStr, 
3920: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3940: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
3950: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
3960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3970: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3980: 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  ey, (iParm&0x000
3990: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
39a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
39b0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
39c0: 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33 56   addr2, sqlite3V
39d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
39e0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
39f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
3a00: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
3a10: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
3a20: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
3a30: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
3a40: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
3a50: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
3a60: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
3a70: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
3a80: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
3a90: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
3aa0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3ab0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
3ac0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
3ad0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
3ae0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3af0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3b00: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3b10: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3b20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3b30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3b40: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
3b50: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
3b60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b70: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3b80: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
3b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64    }..    /* Send
3bb0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
3bc0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
3bd0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
3be0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
3bf0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
3c00: 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69  orter: {.      i
3c10: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
3c20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3c30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
3c40: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3c50: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
3c60: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3c70: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3c80: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
3c90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3ca0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
3cb0: 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  back );.        
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cd0: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
3ce0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
3cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3d00: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3d10: 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75   Invoke a subrou
3d20: 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  tine to handle t
3d30: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
3d40: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
3d50: 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73  lf.    ** is res
3d60: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70  ponsible for pop
3d70: 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ping the results
3d80: 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63   off of the stac
3d90: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
3da0: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
3db0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
3dc0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3df0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3e00: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3e10: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3e20: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3e30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3e40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3e50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
3e60: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
3e70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3e80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3e90: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
3ea0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
3eb0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
3ec0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
3ed0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
3ee0: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
3ef0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
3f00: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
3f10: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
3f20: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
3f30: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
3f40: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
3f50: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
3f60: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
3f70: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
3f80: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
3f90: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
3fa0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3fb0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
3fc0: 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rd );.      sqli
3fd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3fe0: 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c  OP_Pop, nColumn,
3ff0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4010: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4020: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
4030: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
4040: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
4050: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
4060: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
4070: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
4080: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
4090: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
40a0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
40b0: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
40c0: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
40d0: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
40e0: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
40f0: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
4100: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4110: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
4120: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
4130: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
4140: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
4150: 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20  Parse,   /* The 
4160: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4170: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
4180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
4190: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
41a0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
41b0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
41c0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
41d0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
41e0: 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  lumn,     /* Num
41f0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
4200: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4210: 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eDest,       /* 
4220: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
4230: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
4240: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20  .  int iParm    
4250: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
4260: 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69  parameter associ
4270: 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20  ated with eDest 
4280: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 31  */.){.  int end1
4290: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
42a0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
42b0: 74 20 65 6e 64 32 20 3d 20 73 71 6c 69 74 65 33  t end2 = sqlite3
42c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
42d0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
42e0: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
42f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4300: 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  erBy;.  int nCol
4310: 2c 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  , i;.  sqlite *d
4320: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4330: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4340: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4350: 6e 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  n;.  pOrderBy = 
4360: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e  p->pOrderBy;.  n
4370: 43 6f 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Col = pOrderBy->
4380: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
4390: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
43a0: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
43b0: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
43c0: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
43d0: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65  f( pInfo==0 ) re
43e0: 74 75 72 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  turn;.  pInfo->a
43f0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61  SortOrder = (cha
4400: 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  r*)&pInfo->aColl
4410: 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d  [nCol];.  pInfo-
4420: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
4430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4440: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 49 6e  l; i++){.    pIn
4450: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64  fo->aColl[i] = d
4460: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
4470: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
4480: 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
4490: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
44a0: 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
44b0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  VdbeOp3(v, OP_So
44c0: 72 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a  rt, 0, 0, (char*
44d0: 29 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  )pInfo, P3_KEYIN
44e0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61  FO_HANDOFF);.  a
44f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4500: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
4510: 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b  tNext, 0, end1);
4520: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
4530: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t>=0 ){.    sqli
4540: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4550: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
4560: 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 34 29 3b  Offset, addr+4);
4570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4590: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
45a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
45b0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
45c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
45d0: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
45e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
45f0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
4600: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 65 6e 64 32   p->iLimit, end2
4610: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
4620: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4630: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4640: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
4650: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
4660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4670: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
4680: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
46b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
46c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
46d0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
46e0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
46f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4700: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4710: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4720: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4740: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4750: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4760: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4790: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
47a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
47b0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
47c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
47d0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
47e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47f0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  Op3(v, OP_MakeKe
4800: 79 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33  y, 1, 0, "n", P3
4810: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4830: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
4840: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4850: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4860: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69  OP_PutStrKey, (i
4870: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
4880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4890: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
48a0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
48b0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
48c0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
48d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
48e0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
48f0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
4900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4910: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4920: 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62 72   end1);.      br
4930: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4940: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
4950: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
4960: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
4970: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
4980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4990: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
49a0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
49b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
49c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
49d0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
49e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
49f0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4a00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4a10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4a20: 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b  olumn, -1-i, i);
4a30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a40: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
4a50: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
4a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a70: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
4a80: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4a90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4ac0: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4af0: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
4b00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b10: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
4b20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
4b30: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
4b40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4b70: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
4b80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
4b90: 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71  l(v, end2);.  sq
4ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4bb0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4bc0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4bd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
4be0: 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  d1);.  sqlite3Vd
4bf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4c00: 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a  rtReset, 0, 0);.
4c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
4c20: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4c30: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
4c40: 68 65 20 64 61 74 61 74 79 70 65 73 20 6f 66 0a  he datatypes of.
4c50: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
4c60: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a  e result set..**
4c70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4c80: 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 73 20   only generates 
4c90: 63 6f 64 65 20 69 66 20 74 68 65 20 22 50 52 41  code if the "PRA
4ca0: 47 4d 41 20 73 68 6f 77 5f 64 61 74 61 74 79 70  GMA show_datatyp
4cb0: 65 73 3d 6f 6e 22 0a 2a 2a 20 68 61 73 20 62 65  es=on".** has be
4cc0: 65 6e 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  en executed.  Th
4cd0: 65 20 64 61 74 61 74 79 70 65 73 20 61 72 65 20  e datatypes are 
4ce0: 72 65 70 6f 72 74 65 64 20 6f 75 74 20 69 6e 20  reported out in 
4cf0: 74 68 65 20 61 7a 43 6f 6c 0a 2a 2a 20 70 61 72  the azCol.** par
4d00: 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 63 61  ameter to the ca
4d10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
4d20: 20 20 54 68 65 20 66 69 72 73 74 20 4e 20 61 7a    The first N az
4d30: 43 6f 6c 5b 5d 20 65 6e 74 72 69 65 73 0a 2a 2a  Col[] entries.**
4d40: 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f   are the names o
4d50: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 2c 20 61  f the columns, a
4d60: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 4e 20  nd the second N 
4d70: 65 6e 74 72 69 65 73 20 61 72 65 20 74 68 65 0a  entries are the.
4d80: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
4d90: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   the columns..**
4da0: 0a 2a 2a 20 54 68 65 20 22 64 61 74 61 74 79 70  .** The "datatyp
4db0: 65 22 20 66 6f 72 20 61 20 72 65 73 75 6c 74 20  e" for a result 
4dc0: 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  that is a column
4dd0: 20 6f 66 20 61 20 74 79 70 65 20 69 73 20 74 68   of a type is th
4de0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 20 64 65  e.** datatype de
4df0: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
4e00: 65 64 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41  ed from the CREA
4e10: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4e20: 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61 74  nt..** The datat
4e30: 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70 72 65  ype for an expre
4e40: 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ssion is either 
4e50: 54 45 58 54 20 6f 72 20 4e 55 4d 45 52 49 43 2e  TEXT or NUMERIC.
4e60: 20 20 54 68 65 0a 2a 2a 20 64 61 74 61 74 79 70    The.** datatyp
4e70: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
4e80: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a  eld is INTEGER..
4e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
4ea0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
4eb0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
4ec0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4ed0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4ee0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
4ef0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
4f00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
4f10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
4f20: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
4f30: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
4f40: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
4f50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4f60: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
4f70: 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
4f80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
4f90: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
4fa0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
4fb0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68 61 72  .pExpr;.    char
4fc0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 20   *zType = 0;.   
4fd0: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
4fe0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
4ff0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
5000: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
5010: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
5020: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
5030: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
5040: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
5050: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
5060: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
5070: 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62  iCursor!=p->iTab
5080: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
5090: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
50a0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
50b0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
50c0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
50d0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
50e0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
50f0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
5100: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
5110: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
5120: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
5130: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5140: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70   ){.        zTyp
5150: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
5160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5170: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
5180: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5190: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
51a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69  }else{.      swi
51b0: 74 63 68 28 20 73 71 6c 69 74 65 33 45 78 70 72  tch( sqlite3Expr
51c0: 54 79 70 65 28 70 29 20 29 7b 0a 20 20 20 20 20  Type(p) ){.     
51d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
51e0: 46 46 5f 54 45 58 54 3a 20 20 20 20 20 7a 54 79  FF_TEXT:     zTy
51f0: 70 65 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20  pe = "TEXT";    
5200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
5210: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
5220: 55 4d 45 52 49 43 3a 20 20 7a 54 79 70 65 20 3d  UMERIC:  zType =
5230: 20 22 4e 55 4d 45 52 49 43 22 3b 20 62 72 65 61   "NUMERIC"; brea
5240: 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
5250: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
5260: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 41 4e       zType = "AN
5270: 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Y";     break;. 
5280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5290: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
52a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
52b0: 2c 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45  , i + pEList->nE
52c0: 78 70 72 2c 20 30 2c 20 7a 54 79 70 65 2c 20 30  xpr, 0, zType, 0
52d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
52e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
52f0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
5300: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
5310: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
5320: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
5330: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
5340: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
5350: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
5360: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
5370: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
5380: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5390: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
53a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
53b0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
53c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
53d0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
53e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
53f0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5400: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5410: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5420: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5430: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5440: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5450: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
5460: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
5470: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5480: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
5490: 72 74 4e 61 6d 65 73 3b 0a 0a 20 20 61 73 73 65  rtNames;..  asse
54a0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
54b0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
54c0: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
54d0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
54e0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
54f0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
5500: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
5510: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
5520: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
5530: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
5540: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
5550: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5560: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
5570: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
5580: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
5590: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
55a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
55b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
55c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
55d0: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 69 3d 3d      int p2 = i==
55e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 3b  pEList->nExpr-1;
55f0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
5600: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
5610: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
5620: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
5630: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
5640: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
5650: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
5660: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
5670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
5680: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5690: 65 2c 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c  e, i, p2, zName,
56a0: 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
56b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
56c0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
56d0: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
56e0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
56f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
5700: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
5710: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5720: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
5730: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
5740: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
5750: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
5760: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
5770: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
5780: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
5790: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
57a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
57b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
57c0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
57d0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
57e0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
57f0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5800: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5810: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5820: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5830: 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49     zCol = "_ROWI
5840: 44 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  D_";.      }else
5850: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
5860: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5870: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
5880: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
5890: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
58a0: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
58b0: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
58c0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
58d0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
58e0: 64 62 65 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75  dbeOp3(v,OP_Colu
58f0: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70  mnName, i, p2, p
5900: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
5910: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n.n);.        sq
5920: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
5930: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
5940: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5950: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
5960: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
5970: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
5980: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5990: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
59a0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
59b0: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
59c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
59d0: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
59e0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
59f0: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
5a00: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
5a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
5a20: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
5a30: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
5a40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
5a50: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
5a60: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
5a70: 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44   p2, zName, P3_D
5a80: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
5a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5aa0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5ab0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
5ac0: 2c 20 70 32 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a  , p2, zCol, 0);.
5ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5ae0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
5af0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5b00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
5b10: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f  r = sqlite3VdbeO
5b20: 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p3(v,OP_ColumnNa
5b30: 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73 70  me, i, p2, p->sp
5b40: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5b50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5b60: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
5b70: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
5b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
5b90: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
5ba0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
5bb0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
5bc0: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
5bd0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65     sprintf(zName
5be0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
5bf0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5c00: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
5c10: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32  olumnName, i, p2
5c20: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
5c30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5c40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
5c50: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
5c60: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
5c70: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
5c80: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5c90: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
5ca0: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
5cb0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
5cc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
5cd0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
5ce0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
5cf0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
5d00: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
5d10: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
5d20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
5d30: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
5d40: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
5d50: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
5d60: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
5d70: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
5d80: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
5d90: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  n z;.}../*.** Fo
5da0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
5db0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
5dc0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
5dd0: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
5de0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
5df0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
5e00: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
5e10: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
5e20: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
5e30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5e40: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
5e50: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
5e60: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
5e70: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
5e80: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
5e90: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
5ea0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
5eb0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
5ec0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5ed0: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
5ee0: 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e  l;..  if( fillIn
5ef0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
5f00: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
5f10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5f20: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
5f30: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
5f40: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
5f50: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
5f60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
5f70: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62  ab->zName = zTab
5f80: 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72  Name ? sqliteStr
5f90: 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20  Dup(zTabName) : 
5fa0: 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  0;.  pEList = pS
5fb0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
5fc0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45   pTab->nCol = pE
5fd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
5fe0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
5ff0: 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61  l>0 );.  pTab->a
6000: 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c  Col = aCol = sql
6010: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6020: 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29  f(pTab->aCol[0])
6030: 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  *pTab->nCol );. 
6040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
6050: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
6060: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
6070: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
6080: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
6090: 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d      aCol[i].zNam
60a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
60b0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (pEList->a[i].zN
60c0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
60d0: 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61  if( (p=pEList->a
60e0: 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 6f 70 3d 3d  [i].pExpr)->op==
60f0: 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20  TK_DOT .        
6100: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
6110: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
6120: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
6130: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
6140: 20 20 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20        int cnt;. 
6150: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
6160: 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e  String(&aCol[i].
6170: 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e  zName, pR->token
6180: 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c  .z, pR->token.n,
6190: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a   0);.      for(j
61a0: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
61b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
61c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
61d0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f  ol[j].zName, aCo
61e0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
61f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
6200: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  n;.          cha
6210: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
6220: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
6230: 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b  uf,"_%d",++cnt);
6240: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73  .          n = s
6250: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
6260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6270: 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69  tNString(&aCol[i
6280: 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b  ].zName, pR->tok
6290: 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e  en.z, pR->token.
62a0: 6e 2c 20 7a 42 75 66 2c 6e 2c 30 29 3b 0a 20 20  n, zBuf,n,0);.  
62b0: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
62c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
62d0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
62e0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
62f0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
6300: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
6310: 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c  ring(&pTab->aCol
6320: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70  [i].zName, p->sp
6330: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c  an.z, p->span.n,
6340: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
6350: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
6360: 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  30];.      sprin
6370: 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e  tf(zBuf, "column
6380: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
6390: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
63a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
63b0: 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d  Dup(zBuf);.    }
63c0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 66 66  .    .    /* Aff
63d0: 69 6e 69 74 79 20 69 73 20 61 6c 77 61 79 73 20  inity is always 
63e0: 4e 4f 4e 45 2c 20 61 73 20 74 68 65 72 65 20 69  NONE, as there i
63f0: 73 20 6e 6f 20 74 79 70 65 20 6e 61 6d 65 2e 20  s no type name. 
6400: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  */.    pTab->aCo
6410: 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79 20 3d 20  l[i].affinity = 
6420: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
6430: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
6440: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
6450: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
6460: 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   For the given S
6470: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
6480: 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73   do three things
6490: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
64a0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
64b0: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
64c0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
64d0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
64e0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
64f0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
6500: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
6510: 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65  canned.  For vie
6520: 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ws,.**         f
6530: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
6540: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
6550: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
6560: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
6570: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
6580: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
6590: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
65a0: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
65b0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
65c0: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
65d0: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
65e0: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
65f0: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
6600: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
6610: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
6620: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
6630: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
6640: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
6650: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
6660: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
6670: 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  2)  Add terms to
6680: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6690: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
66a0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
66b0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
66c0: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
66d0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
66e0: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
66f0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e  .**    (3)  Scan
6700: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
6710: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
6720: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
6730: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
6740: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
6750: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
6760: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
6770: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
6780: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
6790: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
67a0: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
67b0: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
67c0: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
67d0: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
67e0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
67f0: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
6800: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
6810: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
6820: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
6830: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6840: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
6850: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
6860: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
6870: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
6880: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
6890: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
68a0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
68b0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
68c0: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
68d0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
68e0: 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28  le *pTab;..  if(
68f0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
6900: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6910: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
6920: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
6930: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
6940: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
6950: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
6960: 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  le list..  */.  
6970: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
6980: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
6990: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
69a0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a  t->a[i].pTab ){.
69b0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f        /* This ro
69c0: 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
69d0: 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74  fore!  No need t
69e0: 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20  o continue */.  
69f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6a00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
6a10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6a30: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
6a40: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
6a50: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
6a60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
6a70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6a80: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
6a90: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
6aa0: 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ].zAlias==0 ){. 
6ab0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b         char zFak
6ac0: 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20  eName[60];.     
6ad0: 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65     sprintf(zFake
6ae0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75  Name, "sqlite_su
6af0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20  bquery_%p_",.   
6b00: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
6b10: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6b20: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6b30: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
6b40: 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  (&pTabList->a[i]
6b50: 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61  .zAlias, zFakeNa
6b60: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  me, 0);.      }.
6b70: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6b80: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6b90: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6ba0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6bb0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
6bc0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6bd0: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
6c00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6c10: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
6c20: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6c30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6c40: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
6c50: 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61   isTransient fla
6c60: 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
6c70: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
6c80: 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20  ture has been.  
6c90: 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c      ** dynamical
6ca0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ly allocated and
6cb0: 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74   may be freed at
6cc0: 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f   any time.  In o
6cd0: 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20  ther words,.    
6ce0: 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74    ** pTab is not
6cf0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70   pointing to a p
6d00: 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20  ersistent table 
6d10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
6d20: 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  efines.      ** 
6d30: 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65  part of the sche
6d40: 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  ma. */.      pTa
6d50: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d  b->isTransient =
6d60: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
6d70: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
6d80: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
6d90: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
6da0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
6db0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6dc0: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6dd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6de0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
6df0: 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  se,pTabList->a[i
6e00: 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74  ].zName,pTabList
6e10: 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
6e20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
6e30: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
6e40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6e50: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
6e60: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
6e70: 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
6e80: 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
6e90: 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
6ea0: 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
6eb0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6ec0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
6ed0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
6ee0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
6ef0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6f00: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49    }.        /* I
6f10: 66 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  f pTabList->a[i]
6f20: 2e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d  .pSelect!=0 it m
6f30: 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
6f40: 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20  ing with a.     
6f50: 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69     ** view withi
6f60: 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53  n a view.  The S
6f70: 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20  ELECT structure 
6f80: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
6f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69  .        ** copi
6fa0: 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20  ed by the outer 
6fb0: 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73  view so we can s
6fc0: 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65  kip the copy ste
6fd0: 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a  p here.        *
6fe0: 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76  * in the inner v
6ff0: 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  iew..        */.
7000: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
7010: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7020: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct==0 ){.       
7030: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
7040: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7050: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
7060: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
7070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7080: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
7090: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
70a0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
70b0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
70c0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
70d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
70e0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
70f0: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
7100: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
7110: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
7120: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
7130: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
7140: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
7150: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7160: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
7170: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
7180: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
7190: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
71a0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
71b0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
71c0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
71d0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
71e0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
71f0: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
7200: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
7210: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
7220: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
7230: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
7240: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
7250: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
7260: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
7270: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
7280: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
7290: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
72a0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
72b0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
72c0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
72d0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
72e0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
72f0: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
7300: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
7310: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
7320: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7330: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
7340: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
7350: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
7360: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
7370: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
7380: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
7390: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
73a0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
73b0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
73c0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
73d0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
73e0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
73f0: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
7400: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
7410: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
7420: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
7430: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
7440: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
7450: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
7460: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
7470: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
7480: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
7490: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
74a0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
74b0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
74c0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
74d0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
74e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
74f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7500: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
7510: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
7520: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
7530: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7540: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7550: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
7560: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
7570: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
7580: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
7590: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
75a0: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
75b0: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
75c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
75d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
75e0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
75f0: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
7600: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
7610: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
7620: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
7630: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7640: 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e  pend(pNew, a[k].
7650: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
7660: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
7670: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
7680: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
7690: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
76a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
76b0: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
76c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
76d0: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
76e0: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
76f0: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
7700: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
7710: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
7720: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
7730: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
7740: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
7750: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
7760: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
7770: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
7780: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
7790: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
77a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
77b0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
77c0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
77d0: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d           pName =
77e0: 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b   &pE->pLeft->tok
77f0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  en;.        }els
7800: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  e{.          pNa
7810: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
7820: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
7830: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
7840: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7850: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7860: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
7870: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
7880: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
7890: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
78a0: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
78b0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
78c0: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
78d0: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
78e0: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
78f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7910: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26      if( pName &&
7920: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
7930: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
7940: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
7950: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e       sqlite3StrN
7960: 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a  ICmp(pName->z, z
7970: 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  TabName, pName->
7980: 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  n)!=0 ||.       
7990: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
79a0: 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29  me[pName->n]!=0)
79b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
79c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
79d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
79e0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
79f0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
7a00: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
7a10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
7a20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
7a30: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
7a50: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
7a60: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7a80: 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74  i>0 && (pTabList
7a90: 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
7aa0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
7ab0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
7ac0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
7ad0: 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d  x(pTabList->a[i-
7ae0: 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  1].pTab, zName)>
7af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7b00: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
7b10: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
7b20: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
7b30: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
7b40: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
7b50: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
7b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
7b70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7b90: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 73 71     if( i>0 && sq
7ba0: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
7bb0: 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  (pTabList->a[i-1
7bc0: 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
7bd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
7be0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
7bf0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
7c00: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
7c10: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
7c20: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
7c30: 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
7c40: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
7c50: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
7c60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7c80: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
7c90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
7ca0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7cc0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
7cd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7ce0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
7cf0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
7d00: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7d10: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  en.n = strlen(zN
7d20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
7d30: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7d40: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7d50: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7d60: 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  e && pTabList->n
7d70: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
7d80: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
7d90: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
7da0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7db0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
7dc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
7dd0: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
7de0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
7df0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
7e00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7e10: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7e20: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62  ->token.z = zTab
7e30: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7e40: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
7e50: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62  .n = strlen(zTab
7e60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
7e70: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
7e80: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
7e90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7ea0: 53 65 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a  SetString((char*
7eb0: 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  *)&pExpr->span.z
7ec0: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c  , zTabName, ".",
7ed0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
7ee0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7ef0: 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  >span.n = strlen
7f00: 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b  (pExpr->span.z);
7f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f20: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
7f30: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
7f40: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
7f50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7f60: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
7f70: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
7f80: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
7f90: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
7fa0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7fc0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7fe0: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
7ff0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
8000: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8010: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
8020: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8030: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
8040: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8060: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
8070: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
8080: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
8090: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
80a0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
80b0: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
80c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
80d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
80e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
80f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8100: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
8110: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
8120: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
8130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
8150: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8160: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
8170: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
8180: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
8190: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
81a0: 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73  s routine recurs
81b0: 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68  ively unlinks th
81c0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
81d0: 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a  ].pTab pointers.
81e0: 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73  ** in a select s
81f0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75  tructure.  It ju
8200: 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e  st sets the poin
8210: 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54  ters to NULL.  T
8220: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
8230: 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20 74  s recursive in t
8240: 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 66  he sense that if
8250: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
8260: 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20  .a[].pSelect.** 
8270: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
8280: 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ULL, this routin
8290: 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
82a0: 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20  rsively on that 
82b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
82c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
82d0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c  alled on the Sel
82e0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74 68  ect structure th
82f0: 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20  at defines a.** 
8300: 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f  VIEW in order to
8310: 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e   undo any bindin
8320: 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54  gs to tables.  T
8330: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
8340: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73  .** because thos
8350: 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62  e tables might b
8360: 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73 75  e DROPed by a su
8370: 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d  bsequent SQL com
8380: 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mand..** If the 
8390: 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74  bindings are not
83a0: 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74   removed, then t
83b0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e  he Select.pSrc->
83c0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a  a[].pTab field.*
83d0: 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  * will be left p
83e0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61  ointing to a dea
83f0: 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73  llocated Table s
8400: 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20 74  tructure after t
8410: 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61  he.** DROP and a
8420: 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f   coredump will o
8430: 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74 69  ccur the next ti
8440: 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20 75  me the VIEW is u
8450: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
8460: 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64  ite3SelectUnbind
8470: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
8480: 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
8490: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
84a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
84b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
84c0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
84d0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
84e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
84f0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  b = pSrc->a[i].p
8500: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
8510: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
8520: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
8530: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
8540: 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20  able(0, pTab);. 
8550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72       }.      pSr
8560: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30  c->a[i].pTab = 0
8570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
8580: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[i].pSelect )
8590: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
85a0: 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  3SelectUnbind(pS
85b0: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
85c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
85d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
85e0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
85f0: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
8600: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
8610: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
8620: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
8630: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
8640: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
8650: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
8660: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
8670: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8680: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
8690: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
86a0: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
86b0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
86c0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
86d0: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
86e0: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
86f0: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
8700: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
8710: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
8720: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
8730: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
8740: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
8750: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
8760: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
8770: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
8780: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
8790: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
87a0: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
87b0: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
87c0: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
87d0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
87e0: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
87f0: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
8800: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
8810: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
8820: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
8830: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8840: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8850: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8860: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
8870: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8880: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
8890: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
88a0: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
88b0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
88c0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
88d0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
88e0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
88f0: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
8900: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
8910: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
8920: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
8930: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
8940: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
8950: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
8960: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
8970: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
8980: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
8990: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
89a0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
89b0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
89c0: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
89d0: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
89e0: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
89f0: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
8a00: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
8a10: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8a20: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
8a30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8a40: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
8a50: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
8a60: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
8a70: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8a80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
8a90: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8aa0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
8ab0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8ac0: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
8ad0: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
8ae0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
8af0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8b00: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
8b10: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8b20: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
8b30: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8b40: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8b50: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
8b60: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8b70: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8b80: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
8b90: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8ba0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8bb0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
8bc0: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
8bd0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
8be0: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
8bf0: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8c10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8c20: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
8c30: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
8c40: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
8c50: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
8c60: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
8c70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8c80: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
8c90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8cb0: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
8cc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8cd0: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
8ce0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
8cf0: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
8d00: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
8d10: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8d20: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
8d30: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
8d40: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
8d50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8d60: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
8d70: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
8d80: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
8d90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
8da0: 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e  ssert( pE->token
8db0: 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c  .z );.        zL
8dc0: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  abel = sqliteStr
8dd0: 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  NDup(pE->token.z
8de0: 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  , pE->token.n);.
8df0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8e00: 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a  equote(zLabel);.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8e20: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
8e30: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
8e40: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
8e50: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
8e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
8e70: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
8e80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
8e90: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  l<0 && sqlite3Ex
8ea0: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
8eb0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
8ec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
8ed0: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
8ee0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
8ef0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
8f00: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
8f10: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
8f20: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
8f30: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
8f40: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72  Table;.      pOr
8f50: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8f60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8f70: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
8f80: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
8f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8fa0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
8fb0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
8fc0: 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65  rm number %d doe
8fd0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
8fe0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
8ff0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72  i+1);.      nErr
9000: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
9010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9020: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
9030: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
9040: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
9050: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
9060: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
9070: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
9080: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
9090: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
90a0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
90b0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
90c0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
90d0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
90e0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
90f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9100: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
9110: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
9120: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
9130: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
9140: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
9150: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23 69 66 20 30  turn v;.}..#if 0
9160: 20 20 2f 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f    /***** This ro
9170: 75 74 69 6e 65 20 6e 65 65 64 73 20 64 65 6c 65  utine needs dele
9180: 74 69 6e 67 20 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  ting *****/.stat
9190: 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c  ic void multiSel
91a0: 65 63 74 41 66 66 69 6e 69 74 79 28 53 65 6c 65  ectAffinity(Sele
91b0: 63 74 20 2a 70 2c 20 63 68 61 72 20 2a 7a 41 66  ct *p, char *zAf
91c0: 66 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  f){.  int i;..  
91d0: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
91e0: 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66  .  multiSelectAf
91f0: 66 69 6e 69 74 79 28 70 2d 3e 70 50 72 69 6f 72  finity(p->pPrior
9200: 2c 20 7a 41 66 66 29 3b 0a 0a 20 20 66 6f 72 28  , zAff);..  for(
9210: 69 3d 30 3b 20 69 3c 70 2d 3e 70 45 4c 69 73 74  i=0; i<p->pEList
9220: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9230: 20 20 20 69 66 28 20 7a 41 66 66 5b 69 5d 3d 3d     if( zAff[i]==
9240: 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 7a 41  '\0' ){.      zA
9250: 66 66 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ff[i] = sqlite3E
9260: 78 70 72 41 66 66 69 6e 69 74 79 28 70 2d 3e 70  xprAffinity(p->p
9270: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9280: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
9290: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
92a0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
92b0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
92c0: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
92d0: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
92e0: 2a 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  * nLimit and nOf
92f0: 66 73 65 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c  fset fields.  nL
9300: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
9310: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
9320: 72 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  rs.** that appea
9330: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
9340: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
9350: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
9360: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
9370: 79 77 6f 72 64 73 2e 20 20 4f 72 20 74 68 61 74  ywords.  Or that
9380: 20 68 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20 69   hold -1 and 0 i
9390: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
93a0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a   are omitted..**
93b0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
93c0: 73 65 74 20 61 72 65 20 74 68 65 20 69 6e 74 65  set are the inte
93d0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
93e0: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a  ter numbers for.
93f0: 2a 2a 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ** counters used
9400: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9410: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
9420: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
9430: 6f 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  o.** limit and/o
9440: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 69  r offset, then i
9450: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9460: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
9470: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9480: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
9490: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
94a0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
94b0: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
94c0: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
94d0: 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e  ned by nLimit an
94e0: 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d nOffset.  iLim
94f0: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
9500: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
9510: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
9520: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
9530: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
9540: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
9550: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
9560: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
9570: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
9580: 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f   nLimit>=0 or nO
9590: 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c  ffset>0 do the l
95a0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
95b0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
95c0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
95d0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
95e0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
95f0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
9600: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
9610: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
9620: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
9630: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
9640: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
9650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
9660: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
9670: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
9680: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
9690: 20 2f 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68 65   /* .  ** If the
96a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70   comparison is p
96b0: 2d 3e 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20  ->nLimit>0 then 
96c0: 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 73 0a  "LIMIT 0" shows.
96d0: 20 20 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20    ** all rows.  
96e0: 49 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  It is the same a
96f0: 73 20 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74  s no limit. If t
9700: 68 65 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69  he comparision i
9710: 73 0a 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74  s.  ** p->nLimit
9720: 3e 3d 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20  >=0 then "LIMIT 
9730: 30 22 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20  0" show no rows 
9740: 61 74 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49  at all..  ** "LI
9750: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
9760: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
9770: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
9780: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
9790: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
97a0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
97b0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
97c0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
97d0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
97e0: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
97f0: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
9800: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
9810: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->nLimit>=0 ){.
9820: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
9830: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
9840: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
9850: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9860: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
9870: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
9880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9890: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
98a0: 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a  -p->nLimit, 0);.
98b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
98c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
98d0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
98e0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
98f0: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
9900: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
9910: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
9920: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
9930: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9940: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9950: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
9960: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
9970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9980: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
9990: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
99a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
99b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
99c0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
99d0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
99e0: 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iMem;.  }.}../*.
99f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
9a00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
9a10: 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74  at will open a t
9a20: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74  ransient table t
9a30: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75  hat.** will be u
9a40: 73 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  sed for an index
9a50: 20 6f 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79   or to store key
9a60: 65 64 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  ed results for a
9a70: 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c   compound.** sel
9a80: 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
9a90: 6f 72 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61  ords, open a tra
9aa0: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61  nsient table tha
9ab0: 74 20 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79  t needs a.** Key
9ac0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
9ad0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
9ae0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65  olumns in the Ke
9af0: 79 49 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69  yInfo is determi
9b00: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65  ned.** by the re
9b10: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
9b20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9b30: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
9b40: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4d  rgument..**.** M
9b50: 61 6b 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ake the new tabl
9b60: 65 20 61 20 4b 65 79 41 73 44 61 74 61 20 74 61  e a KeyAsData ta
9b70: 62 6c 65 20 69 66 20 6b 65 79 41 73 44 61 74 61  ble if keyAsData
9b80: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
9b90: 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 54 65 6d  tic void openTem
9ba0: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
9bb0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
9bc0: 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b   int iTab, int k
9bd0: 65 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79  eyAsData){.  Key
9be0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
9bf0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20    int nColumn;. 
9c00: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
9c10: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9c20: 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  i;.  Vdbe *v = p
9c30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
9c40: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
9c50: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29  nList(pParse, p)
9c60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9c70: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
9c80: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
9c90: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ;.  pKeyInfo = s
9ca0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
9cb0: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
9cc0: 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f  Column*sizeof(Co
9cd0: 6c 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69 66 28  llSeq*) );.  if(
9ce0: 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72   pKeyInfo==0 ) r
9cf0: 65 74 75 72 6e 3b 0a 20 20 70 4b 65 79 49 6e 66  eturn;.  pKeyInf
9d00: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
9d10: 75 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  umn;.  for(i=0; 
9d20: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
9d30: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  .    pKeyInfo->a
9d40: 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44  Coll[i] = db->pD
9d50: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 73  fltColl;.  }.  s
9d60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
9d70: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54   OP_OpenTemp, iT
9d80: 61 62 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 4b  ab, 0, (char*)pK
9d90: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
9da0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
9db0: 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a  f( keyAsData ){.
9dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9dd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
9de0: 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a  Data, iTab, 1);.
9df0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9e00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9e10: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
9e20: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
9e30: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
9e40: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
9e50: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
9e60: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
9e70: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
9e80: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
9e90: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
9ea0: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
9eb0: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
9ec0: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
9ed0: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
9ee0: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
9ef0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
9f00: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
9f10: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
9f20: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
9f30: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
9f40: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
9f50: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
9f60: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
9f70: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
9f80: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
9f90: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
9fa0: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
9fb0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
9fc0: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
9fd0: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
9fe0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
9ff0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
a000: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
a010: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
a020: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
a030: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
a040: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
a050: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
a060: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
a070: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
a080: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
a090: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
a0a0: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
a0c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a0d0: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
a0e0: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
a0f0: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
a100: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
a110: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
a120: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
a130: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
a140: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a150: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
a160: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
a170: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
a180: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
a190: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
a1a0: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
a1b0: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
a1c0: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
a1d0: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
a1e0: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
a1f0: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
a200: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
a210: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
a220: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
a230: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
a240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
a250: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
a260: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
a270: 65 6c 65 63 74 20 2a 70 2c 20 0a 20 20 69 6e 74  elect *p, .  int
a280: 20 65 44 65 73 74 2c 20 0a 20 20 69 6e 74 20 69   eDest, .  int i
a290: 50 61 72 6d 2c 20 0a 20 20 63 68 61 72 20 2a 61  Parm, .  char *a
a2a0: 66 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ff           /* 
a2b0: 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
a2c0: 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
a2d0: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
a2e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a2f0: 54 45 5f 4f 4b 3b 20 20 2f 2a 20 53 75 63 63 65  TE_OK;  /* Succe
a300: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
a310: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
a320: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
a330: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
a340: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
a350: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
a360: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
a370: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
a380: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
a390: 44 42 45 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  DBE */.  char *a
a3a0: 66 66 53 74 72 20 3d 20 30 3b 0a 0a 23 69 66 20  ffStr = 0;..#if 
a3b0: 30 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f  0 /* NOT USED */
a3c0: 0a 20 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20  .  if( !aff ){. 
a3d0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
a3e0: 72 63 20 3d 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d  rc = fillInColum
a3f0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29  nList(pParse, p)
a400: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a410: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a420: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
a430: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
a440: 20 20 6c 65 6e 20 3d 20 70 2d 3e 70 45 4c 69 73    len = p->pELis
a450: 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  t->nExpr+1;.    
a460: 61 66 66 53 74 72 20 3d 20 28 63 68 61 72 20 2a  affStr = (char *
a470: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 2d  )sqliteMalloc(p-
a480: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31  >pEList->nExpr+1
a490: 29 3b 0a 20 20 20 20 69 66 28 20 21 61 66 66 53  );.    if( !affS
a4a0: 74 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  tr ){.      rc =
a4b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a4c0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
a4d0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
a4e0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 66 66  }.    memset(aff
a4f0: 53 74 72 2c 20 28 69 6e 74 29 53 51 4c 49 54 45  Str, (int)SQLITE
a500: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 6c 65  _AFF_NUMERIC, le
a510: 6e 2d 31 29 3b 0a 20 20 20 20 61 66 66 20 3d 20  n-1);.    aff = 
a520: 61 66 66 53 74 72 3b 0a 20 20 7d 0a 23 65 6e 64  affStr;.  }.#end
a530: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
a540: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
a550: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
a560: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
a570: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
a580: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 53 45    ** the last SE
a590: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
a5a0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
a5b0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
a5c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
a5d0: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
a5e0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
a5f0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
a600: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
a610: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
a620: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
a630: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
a640: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a650: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
a660: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
a670: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
a680: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
a690: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
a6a0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
a6b0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
a6c0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
a6d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
a6e0: 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20  r->nLimit>=0 || 
a6f0: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e  pPrior->nOffset>
a700: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a710: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a720: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
a730: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
a740: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
a750: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
a760: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
a770: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
a780: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
a790: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
a7a0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
a7b0: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
a7c0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
a7d0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
a7e0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
a7f0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a800: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
a810: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
a820: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
a830: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
a840: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
a850: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
a860: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
a870: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
a880: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
a890: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73  Table ){.    ass
a8a0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
a8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a8c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
a8d0: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
a8e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a8f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
a900: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72  NumColumns, iPar
a910: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
a920: 78 70 72 29 3b 0a 20 20 20 20 65 44 65 73 74 20  xpr);.    eDest 
a930: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
a940: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
a950: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
a960: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
a970: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
a980: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
a990: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
a9a0: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
a9b0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
a9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  =0 ){.        pP
a9d0: 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70  rior->nLimit = p
a9e0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->nLimit;.      
a9f0: 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65    pPrior->nOffse
aa00: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
aa10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
aa20: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
aa30: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
aa40: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
aa50: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
aa60: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
aa70: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
aa80: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
aa90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
aaa0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
aab0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
aac0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
aad0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
aae0: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
aaf0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  fset;.        p-
ab00: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
ab10: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
ab20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
ab30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ab40: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
ab50: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
ab60: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
ab70: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
ab80: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
ab90: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
aba0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
abb0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
abc0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
abd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
abe0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
abf0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
ac00: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
ac10: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
ac20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ac30: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
ac40: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
ac50: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
ac60: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
ac70: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
ac80: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
ac90: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
aca0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
acb0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
acc0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
acd0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
ace0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
acf0: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
ad00: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
ad10: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
ad20: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
ad30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
ad40: 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53  t, nOffset; /* S
ad50: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
ad60: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
ad70: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
ad80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ad90: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
ada0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
adb0: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
adc0: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
add0: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
ade0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
adf0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
ae00: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
ae10: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
ae20: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c  erBy==0 && p->nL
ae30: 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66  imit<0 && p->nOf
ae40: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
ae50: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
ae60: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
ae70: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
ae80: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
ae90: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
aea0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
aeb0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
aec0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
aed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
aee0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
aef0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
af00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
af10: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
af20: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
af30: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
af40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
af50: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
af60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
af70: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
af80: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
af90: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
afa0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
afb0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
afc0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
afd0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
afe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
aff0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
b000: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b010: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41   if( p->op!=TK_A
b020: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
b030: 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50  openTempIndex(pP
b040: 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61  arse, p, unionTa
b050: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 1);.        }
b060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b080: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b090: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
b0a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b0b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
b0c0: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
b0d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
b0e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b0f0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
b100: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
b110: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b120: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
b130: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
b140: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  ab, 0, 0, 0, aff
b150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
b160: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
b170: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
b180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b190: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  if( p->op==TK_AL
b1a0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L ){.        sql
b1b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1c0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
b1d0: 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 50 72  s, unionTab, pPr
b1e0: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
b1f0: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  pr);.      }..  
b200: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
b210: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
b220: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
b230: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
b240: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
b250: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
b260: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
b270: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
b280: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
b290: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
b2a0: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
b2b0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
b2c0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
b2d0: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
b2e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b2f0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
b300: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
b310: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
b320: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b330: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69  y = 0;.      nLi
b340: 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b  mit = p->nLimit;
b350: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
b360: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66   = -1;.      nOf
b370: 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65  fset = p->nOffse
b380: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66  t;.      p->nOff
b390: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
b3a0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
b3b0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
b3c0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
b3d0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
b3e0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
b3f0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
b400: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
b410: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  ;.      p->nLimi
b420: 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  t = nLimit;.    
b430: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e    p->nOffset = n
b440: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
b450: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b460: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b470: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
b480: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
b490: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
b4a0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
b4b0: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
b4c0: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
b4d0: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
b4e0: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
b4f0: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
b500: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
b510: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
b520: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
b530: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
b540: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
b550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b560: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
b570: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b580: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
b590: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
b5a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
b5b0: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
b5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
b5d0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
b5e0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c  pParse, p->pSrc,
b5f0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
b600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b610: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
b620: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b630: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
b640: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b650: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b670: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b680: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
b690: 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  k);.        comp
b6a0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
b6b0: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
b6c0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b6d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b6e0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
b6f0: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
b700: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
b710: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
b720: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
b730: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b760: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
b770: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
b7a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b7b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b7c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
b7d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
b7e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
b7f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
b800: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b810: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
b820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b830: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
b840: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
b850: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
b860: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b870: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
b880: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
b890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b8a0: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
b8b0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
b8c0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
b8e0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
b8f0: 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
b900: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
b910: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
b920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b940: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b950: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
b960: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
b970: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
b980: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
b990: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
b9a0: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20  it, nOffset;..  
b9b0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
b9c0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
b9d0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
b9e0: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
b9f0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
ba00: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
ba10: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
ba20: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
ba30: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
ba40: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
ba50: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
ba60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ba70: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
ba80: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
ba90: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
baa0: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
bab0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
bac0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
bad0: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
bae0: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
baf0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
bb00: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
bb10: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bb20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb30: 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70 50  openTempIndex(pP
bb40: 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 20 31  arse, p, tab1, 1
bb50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bb60: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
bb70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
bb80: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
bb90: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
bba0: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
bbb0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bbc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
bbd0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
bbe0: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
bbf0: 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab1, 0, 0, 0, af
bc00: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
bc10: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
bc20: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bc30: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
bc40: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
bc50: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
bc60: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
bc70: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
bc80: 2f 0a 20 20 20 20 20 20 6f 70 65 6e 54 65 6d 70  /.      openTemp
bc90: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
bca0: 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20   tab2, 1);.     
bcb0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
bcc0: 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70        nLimit = p
bcd0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->nLimit;.      
bce0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
bcf0: 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20        nOffset = 
bd00: 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->nOffset;.    
bd10: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
bd20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
bd30: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
bd40: 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  e, p, SRT_Union,
bd50: 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20   tab2, 0, 0, 0, 
bd60: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
bd70: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
bd80: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
bd90: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
bda0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66  p->nOffset = nOf
bdb0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
bdc0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
bdd0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bde0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
bdf0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
be00: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
be10: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
be20: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
be30: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
be40: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
be50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
be60: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
be70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
be80: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
be90: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
bea0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
beb0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
bec0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
bed0: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
bee0: 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  p->pSrc, p->pELi
bef0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
bf00: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
bf10: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
bf20: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
bf30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bf40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bf50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf60: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
bf70: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
bf80: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
bf90: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
bfa0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53  se, p);.      iS
bfb0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
bfc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75  beAddOp(v, OP_Fu
bfd0: 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b  llKey, tab1, 0);
bfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bff0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
c000: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
c010: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
c020: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
c030: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
c040: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
c050: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
c080: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
c090: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
c0c0: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
c0d0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c0e0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c0f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c100: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c110: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c120: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c130: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
c140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c150: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  Op(v, OP_Next, t
c160: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
c170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c180: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
c190: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
c1a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c1b0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
c1c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c1e0: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
c1f0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  0);.      if( p-
c200: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c210: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
c220: 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
c230: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
c240: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
c250: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
c260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c270: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
c280: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
c290: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
c2a0: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
c2b0: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
c2c0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
c2d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c2e0: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
c2f0: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
c300: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
c310: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
c320: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
c330: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
c340: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
c350: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
c360: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c370: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c380: 65 6e 64 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  end;.  }..multi_
c390: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 23 69 66 20  select_end:.#if 
c3a0: 30 20 20 2f 2a 2a 2a 20 4e 4f 54 20 55 53 45 44  0  /*** NOT USED
c3b0: 20 2a 2a 2a 2a 2f 0a 20 20 69 66 28 20 61 66 66   ****/.  if( aff
c3c0: 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 72  Str ){.    if( r
c3d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
c3f0: 28 61 66 66 53 74 72 29 3b 0a 20 20 20 20 7d 65  (affStr);.    }e
c400: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69  lse{.      multi
c410: 53 65 6c 65 63 74 41 66 66 69 6e 69 74 79 28 70  SelectAffinity(p
c420: 2c 20 61 66 66 53 74 72 29 3b 0a 20 20 20 20 20  , affStr);.     
c430: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c440: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
c450: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 44 59 4e  , affStr, P3_DYN
c460: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
c470: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
c480: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63   rc;.}../*.** Sc
c490: 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
c4a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
c4b0: 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
c4c0: 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
c4d0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
c4e0: 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
c4f0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
c500: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
c510: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
c520: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
c530: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
c540: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
c550: 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
c560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c570: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
c580: 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
c590: 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
c5a0: 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
c5b0: 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
c5c0: 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
c5d0: 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
c5e0: 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
c5f0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
c600: 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
c610: 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
c620: 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
c630: 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
c640: 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
c650: 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
c660: 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
c670: 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
c680: 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
c690: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
c6a0: 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
c6b0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
c6c0: 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
c6d0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
c6e0: 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
c6f0: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
c700: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
c710: 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
c720: 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
c730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
c740: 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45  bstExpr(Expr *pE
c750: 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  xpr, int iTable,
c760: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c770: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  t){.  if( pExpr=
c780: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
c790: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
c7a0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
c7b0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
c7c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
c7d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
c7e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
c7f0: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
c800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
c810: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
c820: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
c830: 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
c840: 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
c850: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c860: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
c870: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
c880: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
c890: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
c8a0: 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
c8b0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
c8c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
c8d0: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
c8e0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
c8f0: 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
c900: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
c910: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
c920: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
c930: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
c940: 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  up(pNew->pLeft);
c950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c960: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
c970: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
c980: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
c990: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52  ExprDup(pNew->pR
c9a0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73  ight);.      ass
c9b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73  ert( pExpr->pLis
c9c0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
c9d0: 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  xpr->pList = sql
c9e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
c9f0: 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
ca00: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
ca10: 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
ca20: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
ca30: 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
ca40: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
ca50: 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
ca60: 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
ca70: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
ca80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
ca90: 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
caa0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
cab0: 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  opy(&pExpr->span
cac0: 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a  , &pNew->span);.
cad0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
cae0: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78     substExpr(pEx
caf0: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
cb00: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
cb10: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
cb20: 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
cb30: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
cb40: 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70  bstExprList(pExp
cb50: 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  r->pList, iTable
cb60: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
cb70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75  .static void .su
cb80: 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  bstExprList(Expr
cb90: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
cba0: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
cbb0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
cbc0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
cbd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
cbe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
cbf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
cc00: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69     substExpr(pLi
cc10: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
cc20: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
cc30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
cc40: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
cc50: 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
cc60: 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
cc70: 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
cc80: 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
cc90: 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
cca0: 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
ccb0: 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
ccc0: 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
ccd0: 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
cce0: 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
ccf0: 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
cd00: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
cd10: 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
cd20: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
cd30: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
cd40: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
cd50: 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
cd60: 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
cd70: 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
cd80: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
cd90: 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
cda0: 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
cdb0: 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
cdc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
cdd0: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
cde0: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
cdf0: 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
ce00: 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
ce10: 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
ce20: 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
ce30: 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
ce40: 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
ce50: 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
ce60: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
ce70: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
ce80: 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
ce90: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
cea0: 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
ceb0: 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
cec0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ced0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
cee0: 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
cef0: 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
cf00: 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
cf10: 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
cf20: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
cf30: 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
cf40: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
cf50: 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
cf60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
cf70: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
cf80: 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
cf90: 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
cfa0: 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
cfb0: 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
cfc0: 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
cfd0: 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
cfe0: 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
cff0: 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
d000: 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
d010: 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
d020: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
d030: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
d040: 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
d050: 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
d060: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
d070: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
d080: 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
d090: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
d0a0: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
d0b0: 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
d0c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
d0d0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d0e0: 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
d0f0: 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
d100: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
d110: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
d120: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d130: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
d140: 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
d150: 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a   outer join, or.
d160: 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75  **        the su
d170: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74  bquery is not it
d180: 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54  self a join.  (T
d190: 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a  icket #306).**.*
d1a0: 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
d1b0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
d1c0: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
d1d0: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
d1e0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
d1f0: 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
d200: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
d210: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
d220: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d230: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
d240: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
d250: 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
d260: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
d270: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
d280: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
d290: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
d2a0: 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
d2b0: 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
d2c0: 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
d2d0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
d2e0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
d2f0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
d300: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
d310: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
d320: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
d330: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
d340: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
d350: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d360: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
d370: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
d380: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
d390: 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
d3a0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
d3b0: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
d3c0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
d3d0: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
d3e0: 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
d3f0: 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
d400: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
d410: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
d420: 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
d430: 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
d440: 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71    (12)  The subq
d450: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
d460: 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
d470: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
d480: 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
d490: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
d4a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
d4b0: 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74  (added by ticket
d4c0: 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20   #350).**.** In 
d4d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
d4e0: 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
d4f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
d500: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
d510: 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
d520: 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
d530: 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
d540: 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
d550: 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
d560: 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
d570: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
d580: 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
d590: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
d5a0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
d5b0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
d5c0: 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
d5d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
d5e0: 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
d5f0: 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
d600: 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
d610: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
d620: 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
d630: 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
d640: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
d650: 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
d660: 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
d670: 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
d680: 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
d690: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
d6a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
d6b0: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
d6c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d6d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
d6e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d6f0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
d700: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d710: 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
d720: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
d730: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
d740: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
d750: 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
d760: 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
d770: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
d780: 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
d790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
d7a0: 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
d7b0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
d7c0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
d7d0: 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
d7e0: 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
d7f0: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
d800: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
d810: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
d820: 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
d830: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
d840: 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
d850: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
d860: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
d870: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
d880: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
d890: 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
d8a0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
d8b0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
d8c0: 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
d8d0: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
d8e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
d8f0: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
d900: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
d910: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
d920: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
d930: 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
d940: 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
d950: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
d960: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
d970: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
d980: 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
d990: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
d9a0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
d9b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
d9c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d9d0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
d9e0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
d9f0: 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
da00: 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
da10: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d  ;.  pSub = pSrc-
da20: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63  >a[iFrom].pSelec
da30: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
da40: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
da50: 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
da60: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
da70: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
da80: 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
da90: 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
daa0: 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
dab0: 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
dac0: 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
dad0: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
dae0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
daf0: 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
db00: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
db10: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
db20: 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
db30: 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
db40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
db50: 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69   if( (p->isDisti
db60: 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74  nct || p->nLimit
db70: 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65 72 79  >=0) && subquery
db80: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
db90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
dba0: 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
dbb0: 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
dbc0: 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  ;..  /* Restrict
dbd0: 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
dbe0: 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
dbf0: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
dc00: 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
dc10: 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
dc20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
dc30: 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
dc40: 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
dc50: 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
dc60: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
dc70: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
dc80: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
dc90: 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
dca0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
dcb0: 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
dcc0: 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
dcd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
dce0: 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
dcf0: 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
dd00: 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
dd10: 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
dd20: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
dd30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53    */.  if( pSubS
dd40: 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46  rc->nSrc>1 && iF
dd50: 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
dd60: 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
dd70: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
dd80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dd90: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
dda0: 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
ddb0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
ddc0: 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
ddd0: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
dde0: 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
ddf0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
de00: 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
de10: 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
de20: 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
de30: 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
de40: 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
de50: 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
de60: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
de70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
de80: 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
de90: 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
dea0: 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
deb0: 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
dec0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
ded0: 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
dee0: 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
def0: 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
df00: 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
df10: 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
df20: 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
df30: 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
df40: 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
df50: 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
df60: 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
df70: 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
df80: 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26    if( iFrom>0 &&
df90: 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
dfa0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
dfb0: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
dfc0: 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72    && pSub->pWher
dfd0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e!=0 ){.    retu
dfe0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
dff0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
e000: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
e010: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
e020: 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65  ermitted for the
e030: 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65  .  ** iFrom-th e
e040: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
e050: 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f   clause in the o
e060: 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
e070: 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20  ..  /* Move all 
e080: 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
e090: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
e0a0: 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
e0b0: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
e0c0: 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
e0d0: 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
e0e0: 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
e0f0: 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
e100: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
e110: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
e120: 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
e130: 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
e140: 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
e150: 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
e160: 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
e170: 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
e180: 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
e190: 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
e1a0: 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
e1b0: 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
e1c0: 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
e1d0: 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
e1e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
e1f0: 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
e200: 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
e210: 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
e220: 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
e230: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e  n..  */.  iParen
e240: 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  t = pSrc->a[iFro
e250: 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a  m].iCursor;.  {.
e260: 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20      int nSubSrc 
e270: 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
e280: 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  .    int jointyp
e290: 65 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  e = pSrc->a[iFro
e2a0: 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20  m].jointype;..  
e2b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46    if( pSrc->a[iF
e2c0: 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72  rom].pTab && pSr
e2d0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
e2e0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
e2f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
e300: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72  leteTable(0, pSr
e310: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
e320: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e330: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e340: 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65  iFrom].zDatabase
e350: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e360: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
e370: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
e380: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e390: 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a  iFrom].zAlias);.
e3a0: 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
e3b0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
e3c0: 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
e3d0: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
e3e0: 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
e3f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
e400: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
e410: 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c  tAppend(pSrc, 0,
e420: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e430: 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
e440: 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
e450: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
e460: 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
e470: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
e480: 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
e490: 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
e4a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
e4b0: 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
e4c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
e4d0: 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
e4e0: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
e4f0: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
e500: 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
e510: 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
e520: 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
e530: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53  pSrc->a[iFrom+nS
e540: 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ubSrc-1].jointyp
e550: 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
e560: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
e570: 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
e580: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
e590: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
e5a0: 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
e5b0: 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
e5c0: 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
e5d0: 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
e5e0: 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
e5f0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
e600: 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
e610: 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
e620: 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
e630: 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
e640: 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
e650: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
e660: 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
e670: 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
e680: 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
e690: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
e6a0: 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
e6b0: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
e6c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e6d0: 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
e6e0: 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
e6f0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
e700: 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
e710: 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
e720: 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
e730: 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
e740: 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
e750: 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
e760: 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
e770: 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78  ..  */.  substEx
e780: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
e790: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e7a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73  >pEList);.  pLis
e7b0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
e7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e7d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e7e0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
e7f0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
e800: 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
e810: 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
e820: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
e830: 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
e840: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
e850: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
e860: 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
e870: 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
e880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
e890: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
e8a0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
e8b0: 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
e8c0: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
e8d0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
e8e0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
e8f0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e900: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
e910: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
e920: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e930: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
e940: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
e950: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
e960: 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
e970: 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  By = 0;.  }else 
e980: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
e990: 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
e9a0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
e9b0: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e9c0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
e9d0: 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
e9e0: 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
e9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ea00: 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
ea10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
ea20: 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
ea30: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
ea40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ea50: 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
ea60: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
ea70: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
ea80: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
ea90: 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
eaa0: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
eab0: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
eac0: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53  ist);.    if( pS
ead0: 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20  ub->pHaving ){. 
eae0: 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69       Expr *pHavi
eaf0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
eb00: 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e  Dup(pSub->pHavin
eb10: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  g);.      if( p-
eb20: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
eb30: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
eb40: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
eb50: 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  AND, p->pHaving,
eb60: 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20   pHaving, 0);.  
eb70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb80: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
eb90: 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d  pHaving;.      }
eba0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
ebb0: 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
ebc0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  0 );.    p->pGro
ebd0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
ebe0: 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e  prListDup(pSub->
ebf0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c  pGroupBy);.  }el
ec00: 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  se if( p->pWhere
ec10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57  ==0 ){.    p->pW
ec20: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
ec30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
ec40: 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  tExpr(p->pWhere,
ec50: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
ec60: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
ec70: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20   pWhere ){.     
ec80: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
ec90: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c  ite3Expr(TK_AND,
eca0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
ecb0: 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
ecc0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  }..  /* The flat
ecd0: 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
ece0: 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
ecf0: 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
ed00: 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  he.  ** outer qu
ed10: 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
ed20: 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69   .  */.  p->isDi
ed30: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
ed40: 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
ed50: 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
ed60: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c  * Transfer the l
ed70: 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
ed80: 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
ed90: 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20  y to the outer. 
eda0: 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   ** query..  */.
edb0: 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d    if( pSub->nLim
edc0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  it>=0 ){.    if(
edd0: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a   p->nLimit<0 ){.
ede0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
edf0: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a  = pSub->nLimit;.
ee00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
ee10: 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73  >nLimit+p->nOffs
ee20: 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  et > pSub->nLimi
ee30: 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  t+pSub->nOffset 
ee40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  ){.      p->nLim
ee50: 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  it = pSub->nLimi
ee60: 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65  t + pSub->nOffse
ee70: 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t - p->nOffset;.
ee80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
ee90: 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e  Offset += pSub->
eea0: 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46  nOffset;..  /* F
eeb0: 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
eec0: 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
eed0: 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
eee0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
eef0: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
ef00: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
ef10: 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
ef20: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
ef30: 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
ef40: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
ef50: 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
ef60: 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
ef70: 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
ef80: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
ef90: 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
efa0: 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
efb0: 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
efc0: 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
efd0: 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
efe0: 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
eff0: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
f000: 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
f010: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
f020: 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
f030: 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
f040: 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
f050: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
f060: 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
f070: 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
f080: 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
f090: 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
f0a0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
f0b0: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
f0c0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
f0d0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
f0e0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
f0f0: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
f100: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
f110: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
f120: 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
f130: 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
f140: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
f150: 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
f160: 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
f170: 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
f180: 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
f190: 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
f1a0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
f1b0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
f1c0: 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
f1d0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
f1e0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
f1f0: 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
f200: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
f210: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
f220: 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
f230: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
f240: 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
f250: 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
f260: 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
f270: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f280: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
f290: 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
f2a0: 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
f2b0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
f2c0: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
f2d0: 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
f2e0: 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
f2f0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
f300: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
f310: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
f320: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
f330: 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  ekOp;.  int cont
f340: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
f350: 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c  List, *pList, eL
f360: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
f370: 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
f380: 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74  tItem;.  SrcList
f390: 20 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a   *pSrc;.  ..  /*
f3a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
f3b0: 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61   this query is a
f3c0: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
f3d0: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52   max() query.  R
f3e0: 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20  eturn.  ** zero 
f3f0: 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20  if it is  not.. 
f400: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
f410: 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76  oupBy || p->pHav
f420: 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65  ing || p->pWhere
f430: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
f440: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
f450: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
f460: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
f470: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
f480: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
f490: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
f4a0: 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20  turn 0;.  pExpr 
f4b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
f4c0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
f4d0: 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
f4e0: 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
f4f0: 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  0;.  pList = pEx
f500: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
f510: 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69   pList==0 || pLi
f520: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
f530: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f540: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33  Expr->token.n!=3
f550: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f560: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
f570: 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
f580: 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
f590: 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
f5a0: 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65  _Rewind;.  }else
f5b0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
f5c0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
f5d0: 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
f5e0: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
f5f0: 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
f600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
f610: 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c    }.  pExpr = pL
f620: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f630: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
f640: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
f650: 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
f660: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
f670: 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
f680: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
f690: 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
f6a0: 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
f6b0: 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
f6c0: 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
f6d0: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
f6e0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
f6f0: 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
f700: 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
f710: 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
f720: 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
f730: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
f740: 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
f750: 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
f760: 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
f770: 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
f780: 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
f790: 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
f7a0: 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
f7b0: 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
f7c0: 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
f7d0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
f7e0: 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
f7f0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
f800: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
f810: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f820: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
f830: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
f840: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
f850: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
f860: 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b  ]==iCol ) break;
f870: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f880: 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
f890: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
f8a0: 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
f8b0: 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
f8c0: 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
f8d0: 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
f8e0: 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
f8f0: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
f900: 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
f910: 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
f920: 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c  ll..  ** The col
f930: 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61  umn names have a
f940: 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
f950: 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c  rated in the cal
f960: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ling function.. 
f970: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f980: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f990: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
f9a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 65  eturn 0;.  if( e
f9b0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
f9c0: 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
f9d0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
f9e0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70  arse, p->pSrc, p
f9f0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
fa00: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
fa10: 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
fa20: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
fa30: 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
fa40: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
fa50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
fa60: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
fa70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fa80: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
fa90: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
faa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fab0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
fac0: 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ns, iParm, 1);. 
fad0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
fae0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
faf0: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
fb00: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
fb10: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
fb20: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
fb30: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
fb40: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
fb50: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
fb60: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
fb70: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
fb80: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
fb90: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
fba0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
fbb0: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
fbc0: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
fbd0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
fbe0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
fbf0: 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
fc00: 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
fc10: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
fc20: 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
fc30: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
fc40: 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
fc50: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
fc60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
fc70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fc80: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
fc90: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
fca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fcb0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fcc0: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
fcd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fce0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
fcf0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73  tNumColumns, bas
fd00: 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  e, pTab->nCol);.
fd10: 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c    }.  cont = sql
fd20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
fd30: 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78  l(v);.  if( pIdx
fd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fd50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
fd60: 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
fd70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fd80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fd90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
fda0: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
fdb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
fdc0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fdd0: 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e  base+1, pIdx->tn
fde0: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
fdf0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
fe00: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  Idx->keyInfo, P3
fe10: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
fe20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe30: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
fe40: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fe50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fe60: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
fe70: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
fe80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe90: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
fea0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
feb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fec0: 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
fed0: 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
fee0: 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
fef0: 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
ff00: 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
ff10: 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
ff20: 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
ff30: 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
ff40: 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
ff50: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ff60: 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
ff70: 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
ff80: 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
ff90: 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cont, 0);.  sqli
ffa0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ffb0: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
ffc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffd0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
ffe0: 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74  se, 0);.  .  ret
fff0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
10000 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
10010 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
10020 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
10030 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
10040 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
10050 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
10060 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
10070 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65  .** value of eDe
10080 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a  st and iParm..**
10090 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61  .**     eDest Va
100a0 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74  lue       Result
100b0 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
100c0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100f0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
10100 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
10110 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
10120 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
10130 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
10140 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
10150 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
10160 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
10170 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a  y cell iParm.**.
10180 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
10190 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
101a0 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
101b0 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
101c0 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
101d0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
101e0 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
101f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10200 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
10210 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
10220 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
10230 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
10240 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
10250 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
10260 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
10270 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
10280 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
10290 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  rm.**.** The tab
102a0 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f  le above is inco
102b0 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f  mplete.  Additio
102c0 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20  nal eDist value 
102d0 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a  have be added.**
102e0 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d   since this comm
102f0 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e  ent was written.
10300 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74    See the select
10310 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
10320 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f  tion for.** a co
10330 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f  mplete listing o
10340 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61  f the allowed va
10350 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
10360 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
10370 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10380 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
10390 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
103a0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
103b0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
103c0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
103d0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
103e0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
103f0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
10400 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
10410 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
10420 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
10430 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
10440 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
10450 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
10460 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
10470 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
10480 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
10490 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
104a0 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
104b0 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
104c0 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
104d0 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
104e0 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
104f0 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
10500 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
10510 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
10520 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
10530 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
10540 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
10550 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
10560 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
10570 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
10580 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
10590 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
105a0 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
105b0 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
105c0 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
105d0 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
105e0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
105f0 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
10600 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
10610 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
10620 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
10630 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
10640 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
10650 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
10660 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
10690 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
106a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
106b0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
106f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10700 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
10710 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
10720 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
10730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10740 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
10750 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
10760 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
10770 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
10780 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
10790 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
107a0 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
107b0 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
107c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
107d0 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
107e0 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
107f0 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
10800 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
10810 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
10820 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
10830 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
10840 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10850 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
10860 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
10870 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
10880 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
10890 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
108a0 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
108b0 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
108c0 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
108d0 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
108e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
108f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
10900 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
10910 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
10930 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10940 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
10950 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
10960 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10970 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
10980 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
10990 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
109a0 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
109b0 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
109c0 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
109d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
109e0 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
109f0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
10a00 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
10a10 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
10a20 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
10a30 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
10a40 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
10a50 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
10a60 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10a70 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20  *pParentAgg,    
10a80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
10a90 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
10aa0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
10ab0 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
10ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
10ad0 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
10ae0 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
10af0 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
10b00 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49   int i;.  WhereI
10b10 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56  nfo *pWInfo;.  V
10b20 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73  dbe *v;.  int is
10b30 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Agg = 0;        
10b40 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
10b50 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
10b60 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
10b70 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10b80 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
10b90 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
10ba0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
10bb0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
10bc0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
10bd0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
10be0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
10bf0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
10c00 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10c10 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
10c20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10c30 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
10c40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10c50 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
10c60 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10c70 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
10c80 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
10c90 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
10ca0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
10cb0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
10cc0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
10cd0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
10ce0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
10cf0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
10d00 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
10d10 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
10d20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
10d30 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
10d40 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
10d50 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
10d60 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
10d70 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
10d80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
10d90 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
10da0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  s function */.. 
10db0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
10dc0 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
10dd0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
10de0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10df0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10e00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10e10 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
10e20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
10e30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10e40 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
10e50 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
10e60 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
10e70 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
10e80 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
10e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
10ea0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
10eb0 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
10ec0 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , aff);.  }..  /
10ed0 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
10ee0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
10ef0 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
10f00 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
10f10 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
10f20 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
10f30 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
10f40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
10f50 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
10f60 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
10f70 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
10f80 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
10f90 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
10fa0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10fb0 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72  VDBE cursors for
10fc0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
10fd0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
10fe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
10ff0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11000 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
11010 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  st);..  /* .  **
11020 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
11030 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
11040 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
11050 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
11060 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
11070 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
11080 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
11090 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
110a0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
110b0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70  t_end;..  /* Exp
110c0 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d  and any "*" term
110d0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
110e0 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70  set.  (For examp
110f0 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20  le the "*" in.  
11100 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
11110 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c  M t1")  The fill
11120 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72  InColumnlist() r
11130 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
11140 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72   some.  ** other
11150 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20   housekeeping - 
11160 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  see the header c
11170 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69  omment for detai
11180 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ls..  */.  if( f
11190 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
111a0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
111b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
111c0 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20  d;.  }.  pWhere 
111d0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
111e0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
111f0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
11200 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
11210 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
11220 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
11230 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
11240 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
11250 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
11260 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
11270 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
11280 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
11290 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
112a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
112b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
112c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
112d0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
112e0 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
112f0 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
11300 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
11310 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
11320 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
11330 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
11340 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
11350 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
11360 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
11370 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  */.  switch( eDe
11380 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
11390 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61  RT_Union:.    ca
113a0 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20  se SRT_Except:. 
113b0 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63     case SRT_Disc
113c0 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65  ard:.      pOrde
113d0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  rBy = 0;.      b
113e0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
113f0 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
11400 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
11410 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75  s point, we shou
11420 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
11430 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  d all the cursor
11440 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e  s that we.  ** n
11450 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75  eed to handle su
11460 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70  bquerys and temp
11470 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a  orary tables.  .
11480 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76    **.  ** Resolv
11490 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
114a0 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61  es and do a sema
114b0 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61  ntics check on a
114c0 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
114d0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
114e0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
114f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
11500 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
11510 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11520 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45   pTabList, 0, pE
11530 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11540 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11550 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11560 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
11570 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
11580 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
11590 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67  pExpr, 1, &isAgg
115a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
115b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
115c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  }.  }.  if( pWhe
115d0 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  re ){.    if( sq
115e0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
115f0 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11600 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57  List, pEList, pW
11610 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
11620 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11640 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
11650 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30  Parse, pWhere, 0
11660 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  , 0) ){.      go
11670 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11680 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
11690 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
116a0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
116b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
116c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
116d0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
116e0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
116f0 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
11700 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11710 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
11720 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
11730 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
11740 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11750 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  st, pHaving) ){.
11760 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11770 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
11780 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11790 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48  Check(pParse, pH
117a0 61 76 69 6e 67 2c 20 31 2c 20 26 69 73 41 67 67  aving, 1, &isAgg
117b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
117c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
117d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64  }.  }.  if( pOrd
117e0 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
117f0 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
11800 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11810 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
11820 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
11830 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
11840 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
11850 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11860 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26  ger(pE, &iCol) &
11870 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  & iCol>0 && iCol
11880 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
11890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
118a0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
118b0 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
118c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
118d0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
118e0 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
118f0 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
11900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11910 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11920 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11930 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11940 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
11950 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11970 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
11980 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
11990 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
119a0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
119b0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
119c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
119d0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
119e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
119f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11a00 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
11a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11a30 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
11a40 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
11a50 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
11a60 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
11a70 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20  nstants");.     
11a80 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11a90 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  _end;.        }e
11aa0 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20  lse if( iCol<=0 
11ab0 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
11ac0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
11ad0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11ae0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
11af0 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
11b00 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
11b10 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
11b20 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
11b30 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
11b40 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
11b50 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
11b60 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
11b70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11b90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11ba0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
11bb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
11bc0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
11bd0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
11be0 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
11bf0 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
11c00 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11c20 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11c30 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
11c40 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
11c50 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11c60 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11c70 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
11c80 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   pE = pGroupBy->
11c90 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
11ca0 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
11cb0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
11cc0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
11cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11ce0 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
11cf0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
11d00 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
11d10 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11d20 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11d30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11d40 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
11d50 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
11d60 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11d70 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11d80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
11d90 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11da0 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
11db0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11dc0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11dd0 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20   &iCol)==0 ){.  
11de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11df0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11e00 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
11e10 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74  UP BY terms must
11e20 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65   not be non-inte
11e30 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b  ger constants");
11e40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11e50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11e60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
11e70 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
11e80 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
11e90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11ea0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47  .             "G
11ec0 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e  ROUP BY column n
11ed0 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
11ee0 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
11ef0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
11f00 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
11f10 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73  %d", iCol, pELis
11f20 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
11f30 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11f40 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
11f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11f60 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
11f70 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
11f80 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11f90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11fa0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
11fb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11fc0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
11fd0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
11fe0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
11ff0 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
12000 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
12010 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
12020 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
12030 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
12040 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
12050 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12060 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
12070 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
12080 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
12090 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
120a0 69 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 31  ist);.  }..#if 1
120b0 20 20 2f 2a 20 49 20 64 6f 20 6e 6f 74 20 74 68    /* I do not th
120c0 69 6e 6b 20 77 65 20 6e 65 65 64 20 74 68 65 20  ink we need the 
120d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61  following code a
120e0 6e 79 20 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20  ny more.... */. 
120f0 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
12100 6e 61 74 69 6f 6e 20 69 73 20 53 52 54 5f 55 6e  nation is SRT_Un
12110 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 74 68  ion, then set th
12120 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
12130 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  mns in.  ** the 
12140 72 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c  records that wil
12150 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
12160 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
12170 20 74 61 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c   table. The call
12180 65 72 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e 27 74  er.  ** couldn't
12190 20 64 6f 20 74 68 69 73 2c 20 69 6e 20 63 61 73   do this, in cas
121a0 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
121b0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
121c0 20 66 6f 72 6d 20 0a 20 20 2a 2a 20 22 53 45 4c   form .  ** "SEL
121d0 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22  ECT * FROM ...."
121e0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  . .  **.  ** We 
121f0 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
12200 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 20  before we start 
12210 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64  inserting record
12220 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  s into the .  **
12230 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12240 20 28 77 68 69 63 68 20 68 61 73 20 68 61 64 20   (which has had 
12250 4f 50 5f 4b 65 79 41 73 44 61 74 61 20 65 78 65  OP_KeyAsData exe
12260 63 75 74 65 64 20 6f 6e 20 69 74 29 2c 20 62 65  cuted on it), be
12270 63 61 75 73 65 0a 20 20 2a 2a 20 69 74 20 69 73  cause.  ** it is
12280 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
12290 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   key comparison 
122a0 66 75 6e 63 74 69 6f 6e 2e 20 53 6f 20 64 6f 20  function. So do 
122b0 69 74 20 6e 6f 77 2c 20 65 76 65 6e 0a 20 20 2a  it now, even.  *
122c0 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20 6d 65  * though this me
122d0 61 6e 73 20 74 68 61 74 20 4f 50 5f 53 65 74 4e  ans that OP_SetN
122e0 75 6d 43 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  umColumns may be
122f0 20 65 78 65 63 75 74 65 64 20 6f 6e 20 74 68 65   executed on the
12300 20 73 61 6d 65 0a 20 20 2a 2a 20 63 75 72 73 6f   same.  ** curso
12310 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  r more than once
12320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12330 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b  st==SRT_Union ){
12340 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12350 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
12360 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d  umColumns, iParm
12370 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
12380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12390 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
123a0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
123b0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
123c0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
123d0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
123e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
123f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12400 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
12410 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  t;.    int needR
12420 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a  estoreContext;..
12430 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
12440 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
12450 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12460 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
12470 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b  a[i].zName!=0 ){
12480 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
12490 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
124a0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
124b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
124c0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54  AuthContext = pT
124d0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
124e0 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
124f0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
12500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12510 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
12520 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
12530 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12540 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
12550 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
12560 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t, SRT_TempTable
12570 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12580 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
12590 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  i].iCursor, p, i
125a0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
125b0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
125c0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
125d0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
125e0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
125f0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
12600 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
12610 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
12620 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12630 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
12640 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
12650 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
12660 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
12670 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
12680 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12690 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
126a0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
126b0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
126c0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
126d0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
126e0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
126f0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
12700 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
12710 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
12720 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
12730 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
12740 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
12750 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
12760 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
12770 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
12780 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
12790 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
127a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
127b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
127c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
127d0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
127e0 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
127f0 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
12800 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
12810 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
12820 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
12830 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
12840 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
12850 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
12860 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
12870 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
12880 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
12890 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
128a0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
128b0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
128c0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
128d0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
128e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
128f0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
12900 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  r..  */.  comput
12910 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12920 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f  pParse, p);..  /
12930 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
12940 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
12950 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63 61  ll be using a ca
12960 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
12970 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
12980 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
12990 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64   is going to a d
129a0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
129b0 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c  .  ** than a cal
129c0 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
129d0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
129e0 68 69 73 20 73 65 70 61 72 61 74 65 6c 79 20 66  his separately f
129f0 72 6f 6d 20 74 68 65 20 63 72 65 61 74 69 6f 6e  rom the creation
12a00 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
12a10 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62 65 63 61  .  ** above beca
12a20 75 73 65 20 69 66 20 74 68 65 20 70 54 61 62 4c  use if the pTabL
12a30 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 76 69 65  ist contains vie
12a40 77 73 20 74 68 65 6e 20 74 68 65 79 20 77 69 6c  ws then they wil
12a50 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20  l not.  ** have 
12a60 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e  been resolved an
12a70 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  d we will not kn
12a80 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  ow the column ty
12a90 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e  pes until.  ** n
12aa0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ow..  */.  if( e
12ab0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
12ac0 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
12ad0 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
12ae0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
12af0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
12b00 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
12b10 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
12b20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12b30 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
12b40 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
12b50 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
12b60 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
12b70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12b80 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
12b90 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
12ba0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12bb0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12bc0 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
12bd0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
12be0 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
12bf0 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
12c00 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
12c10 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
12c20 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
12c30 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
12c40 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
12c50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
12c60 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
12c70 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
12c80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12c90 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12ca0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
12cb0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
12cc0 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
12cd0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
12ce0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
12cf0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12d10 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
12d20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
12d30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
12d40 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
12d50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12d60 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
12d70 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f  tes(pParse, pGro
12d80 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
12d90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
12da0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12dc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12dd0 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74  pHaving && sqlit
12de0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
12df0 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
12e00 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
12e10 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12e20 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
12e30 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12e40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
12e50 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
12e60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12e70 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
12e80 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
12e90 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
12ea0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
12eb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
12ec0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12ed0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12ee0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  }.  }..  /* Rese
12ef0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  t the aggregator
12f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
12f10 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
12f20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12f30 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61  AggReset, 0, pPa
12f40 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20  rse->nAgg);.    
12f50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
12f60 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
12f70 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
12f80 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28  unc;.      if( (
12f90 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  pFunc = pParse->
12fa0 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d  aAgg[i].pFunc)!=
12fb0 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e  0 && pFunc->xFin
12fc0 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
12fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
12fe0 70 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74  p3(v, OP_AggInit
12ff0 2c 20 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70  , 0, i, (char*)p
13000 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52  Func, P3_POINTER
13010 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13020 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
13030 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
13040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13050 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
13060 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
13070 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13080 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29  _AggFocus, 0, 0)
13090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
130a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
130b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
130c0 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
130d0 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
130e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
130f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
13100 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
13110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13120 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
13130 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
13140 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d  .  /* Open a tem
13150 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
13160 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
13170 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
13180 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
13190 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  ){.    distinct 
131a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
131b0 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e  ;.    openTempIn
131c0 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64  dex(pParse, p, d
131d0 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d  istinct, 0);.  }
131e0 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
131f0 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
13200 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
13210 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a  abase scan.  */.
13220 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
13230 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
13240 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
13250 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20  Where, 0, .     
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
13280 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29  ? 0 : &pOrderBy)
13290 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
132a0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
132b0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
132c0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
132d0 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
132e0 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
132f0 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
13300 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
13310 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
13320 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13330 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
13340 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
13350 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
13360 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13370 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
13380 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
13390 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
133a0 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
133b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
133c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
133d0 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   If we are deali
133e0 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74  ng with aggregat
133f0 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  es, then do the 
13400 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74  special aggregat
13410 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  e.  ** processin
13420 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  g.  .  */.  else
13430 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70  {.    AggExpr *p
13440 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72  Agg;.    if( pGr
13450 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
13460 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66  nt lbl1;.      f
13470 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
13480 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
13490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
134a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
134b0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
134c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
134d0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69        /* No affi
134e0 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61  nity string is a
134f0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66  ttached to the f
13500 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65  ollowing OP_Make
13510 4b 65 79 20 0a 20 20 20 20 20 20 2a 2a 20 62 65  Key .      ** be
13520 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74 20  cause we do not 
13530 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 63  need to do any c
13540 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61 74  oercion of datat
13550 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ypes. */.      s
13560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13570 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
13580 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
13590 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  0);.      lbl1 =
135a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
135b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
135c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135d0 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
135e0 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   0, lbl1);.     
135f0 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
13600 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
13610 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
13620 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
13630 20 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41     if( pAgg->isA
13640 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
13650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13660 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13670 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  Agg->pExpr);.   
13680 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13690 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53  AddOp(v, OP_AggS
136a0 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  et, 0, i);.     
136b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
136c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
136d0 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d  (v, lbl1);.    }
136e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41  .    for(i=0, pA
136f0 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b  gg=pParse->aAgg;
13700 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
13710 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20   i++, pAgg++){. 
13720 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
13730 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
13740 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
13750 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Def;.      if( !
13760 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f  pAgg->isAgg ) co
13770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
13780 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
13790 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
137a0 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
137b0 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20  c->xStep!=0 );. 
137c0 20 20 20 20 20 70 44 65 66 20 3d 20 70 41 67 67       pDef = pAgg
137d0 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70  ->pFunc;.      p
137e0 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b  E = pAgg->pExpr;
137f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13800 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  E!=0 );.      as
13810 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b  sert( pE->op==TK
13820 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
13830 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
13840 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
13850 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
13860 45 2d 3e 70 4c 69 73 74 2c 20 70 44 65 66 2d 3e  E->pList, pDef->
13870 69 6e 63 6c 75 64 65 54 79 70 65 73 29 3b 0a 20  includeTypes);. 
13880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13890 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
138a0 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
138b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
138c0 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20  (v, OP_AggFunc, 
138d0 30 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a  0, nExpr, (char*
138e0 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45  )pDef, P3_POINTE
138f0 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
13900 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
13910 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
13920 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68    */.  sqlite3Wh
13930 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
13940 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
13950 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
13960 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74  gates, we need t
13970 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e  o set up a secon
13980 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72  d loop.  ** over
13990 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72   all of the aggr
139a0 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64  egate values and
139b0 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20   process them.. 
139c0 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
139d0 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67  ){.    int endag
139e0 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  g = sqlite3VdbeM
139f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13a00 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
13a10 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
13a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13a30 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
13a40 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
13a50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
13a60 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
13a70 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
13a80 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
13a90 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
13aa0 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20  tartagg, 1);.   
13ab0 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63   }.    if( selec
13ac0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13ad0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
13ae0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
13af0 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61     iParm, starta
13b20 67 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29  gg, endagg, aff)
13b30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
13b40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13b50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13b60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
13b70 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a  , 0, startagg);.
13b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
13b90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
13ba0 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  ndagg);.    sqli
13bb0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13bc0 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
13bd0 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
13be0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
13bf0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
13c00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13c10 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
13c20 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
13c30 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
13c40 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
13c50 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
13c60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
13c70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
13c80 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
13c90 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
13ca0 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
13cb0 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
13cc0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
13cd0 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
13ce0 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
13cf0 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
13d00 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
13d10 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
13d20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75  delete the subqu
13d30 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72  ery structure fr
13d40 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  om the parent.  
13d50 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
13d60 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d  is subquery from
13d70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
13d80 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f   again and to fo
13d90 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  rce the.  ** the
13da0 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70   use of the temp
13db0 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
13dc0 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
13dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13de0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
13df0 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
13e00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
13e10 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
13e20 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
13e30 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =p );.    sqlite
13e40 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29  3SelectDelete(p)
13e50 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  ;.    pParent->p
13e60 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
13e70 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ].pSelect = 0;. 
13e80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c   }..  /* The SEL
13e90 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
13ea0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
13eb0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
13ec0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
13ed0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
13ee0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
13ef0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
13f00 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
13f10 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
13f20 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
13f30 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
13f40 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
13f50 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
13f60 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
13f70 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
13f80 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
13f90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13fa0 7d 0a                                            }.