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

Artifact 91570af7f13d1c5584f3b711676e1226ee12194e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 39 32  select.c,v 1.192
0200: 20 32 30 30 34 2f 30 36 2f 31 37 20 30 37 3a 35   2004/06/17 07:5
0210: 33 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:03 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
0250: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0260: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0270: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0280: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0290: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
02a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
02b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
02c0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
02d0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
02e0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
02f0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0300: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0310: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0320: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0330: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0340: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0350: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0360: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0370: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0380: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0390: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
03a0: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
03b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
03c0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
03d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
03e0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
03f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0400: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c   int isDistinct,
0410: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69         /* true i
0420: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0430: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0440: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6d 69  t */.  int nLimi
0450: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
0460: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 2d 31  LIMIT value.  -1
0470: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0480: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74  */.  int nOffset
0490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46             /* OF
04a0: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 30 20 6d  FSET value.  0 m
04b0: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
04c0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
04d0: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
04e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
04f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
0500: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0520: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
0530: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0540: 69 73 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b  istDelete(pSrc);
0550: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0560: 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a  Delete(pWhere);.
0570: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0580: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0590: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
05a0: 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69  ExprDelete(pHavi
05b0: 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
05c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
05d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73  OrderBy);.  }els
05e0: 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e{.    if( pELis
05f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  t==0 ){.      pE
0600: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
0610: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0620: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
0630: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0640: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70     }.    pNew->p
0650: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0660: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
0670: 20 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d   pSrc;.    pNew-
0680: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
0690: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
06a0: 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
06b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  .    pNew->pHavi
06c0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
06d0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
06e0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
06f0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
0700: 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a  t = isDistinct;.
0710: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54      pNew->op = T
0720: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e  K_SELECT;.    pN
0730: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69  ew->nLimit = nLi
0740: 6d 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  mit;.    pNew->n
0750: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
0760: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  ;.    pNew->iLim
0770: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65  it = -1;.    pNe
0780: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
07a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
07b0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
07c0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
07d0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
07e0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
07f0: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0800: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0810: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0820: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0830: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0840: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0850: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0860: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0870: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
0880: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0890: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
08a0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
08b0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
08c0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
08d0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
08e0: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
08f0: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0900: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0910: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0920: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0930: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0940: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0950: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0960: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0970: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0980: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0990: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
09a0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
09b0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
09c0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
09d0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
09e0: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
09f0: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74   *p;.  static st
0a00: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
0a10: 20 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b   char *zKeyword;
0a20: 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  .    int nChar;.
0a30: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
0a40: 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b  } keywords[] = {
0a50: 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22  .    { "natural"
0a60: 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20  , 7, JT_NATURAL 
0a70: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c  },.    { "left",
0a80: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a90: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0aa0: 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a   "right",   5, J
0ab0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0ac0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0ad0: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0ae0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0af0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65  R },.    { "oute
0b00: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45  r",   5, JT_OUTE
0b10: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65  R },.    { "inne
0b20: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  r",   5, JT_INNE
0b30: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73  R },.    { "cros
0b40: 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  s",   5, JT_INNE
0b50: 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  R },.  };.  int 
0b60: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
0b70: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
0b80: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
0b90: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
0ba0: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
0bb0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
0bc0: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
0bd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65   for(j=0; j<size
0be0: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0bf0: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
0c10: 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73  ( p->n==keywords
0c20: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
0c30: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
0c40: 74 72 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65  trNICmp(p->z, ke
0c50: 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f  ywords[j].zKeywo
0c60: 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  rd, p->n)==0 ){.
0c70: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
0c80: 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e   |= keywords[j].
0c90: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
0ca0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
0cb0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69   }.    if( j>=si
0cc0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73  zeof(keywords)/s
0cd0: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30  izeof(keywords[0
0ce0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  ]) ){.      join
0cf0: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
0d00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0d10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
0d20: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
0d30: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
0d40: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
0d50: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
0d60: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
0d70: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
0d80: 20 20 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e      static Token
0d90: 20 64 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20   dummy = { 0, 0 
0da0: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70  };.    char *zSp
0db0: 31 20 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d  1 = " ", *zSp2 =
0dc0: 20 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42   " ";.    if( pB
0dd0: 3d 3d 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d  ==0 ){ pB = &dum
0de0: 6d 79 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a  my; zSp1 = 0; }.
0df0: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
0e00: 20 70 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53   pC = &dummy; zS
0e10: 70 32 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71  p2 = 0; }.    sq
0e20: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
0e30: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0e40: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
0e50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e60: 79 70 65 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20  ype: ", 0,.     
0e70: 20 20 70 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20    pA->z, pA->n, 
0e80: 7a 53 70 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20  zSp1, 1, pB->z, 
0e90: 70 42 2d 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20  pB->n, zSp2, 1, 
0ea0: 70 43 2d 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29  pC->z, pC->n, 0)
0eb0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
0ec0: 72 72 2b 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  rr++;.    jointy
0ed0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0ee0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0ef0: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f20: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f30: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f40: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f50: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f70: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0f80: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fb0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fc0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0fd0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
0fe0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
0ff0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1000: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1010: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1020: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1030: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1050: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1070: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1080: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1090: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
10c0: 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52  term to the WHER
10d0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  E expression in 
10e0: 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71  *ppExpr that req
10f0: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f  uires the.** zCo
1100: 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65  l column to be e
1110: 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20  qual in the two 
1120: 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64  tables pTab1 and
1130: 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69   pTab2..*/.stati
1140: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1150: 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  erm(.  const cha
1160: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  r *zCol,        
1170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1180: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
1190: 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20   Table *pTab1,  
11a0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62      /* First tab
11b0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  le */.  const Ta
11c0: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
11d0: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
11e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
11f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
1200: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
1210: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1220: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
1230: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1240: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1250: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1260: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1270: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1280: 70 45 3b 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d  pE;..  dummy.z =
1290: 20 7a 43 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e   zCol;.  dummy.n
12a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b   = strlen(zCol);
12b0: 0a 20 20 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30  .  dummy.dyn = 0
12c0: 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ;.  pE1a = sqlit
12d0: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
12e0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70   0, &dummy);.  p
12f0: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  E2a = sqlite3Exp
1300: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
1310: 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d 79 2e  dummy);.  dummy.
1320: 7a 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  z = pTab1->zName
1330: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1340: 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20  rlen(dummy.z);. 
1350: 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 45   pE1b = sqlite3E
1360: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1370: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 64 75 6d 6d   &dummy);.  dumm
1380: 79 2e 7a 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61  y.z = pTab2->zNa
1390: 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20  me;.  dummy.n = 
13a0: 73 74 72 6c 65 6e 28 64 75 6d 6d 79 2e 7a 29 3b  strlen(dummy.z);
13b0: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
13c0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
13d0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45  0, &dummy);.  pE
13e0: 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1c = sqlite3Expr
13f0: 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70  (TK_DOT, pE1b, p
1400: 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20  E1a, 0);.  pE2c 
1410: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1420: 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61  _DOT, pE2b, pE2a
1430: 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c  , 0);.  pE = sql
1440: 69 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20  ite3Expr(TK_EQ, 
1450: 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a  pE1c, pE2c, 0);.
1460: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1470: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
1480: 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70 45 78 70  n);.  if( *ppExp
1490: 72 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  r ){.    *ppExpr
14a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
14b0: 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72 2c 20  K_AND, *ppExpr, 
14c0: 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pE, 0);.  }else{
14d0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
14e0: 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
14f0: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
1500: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
1510: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1520: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1530: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1540: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1550: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1560: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1570: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1580: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1590: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
15a0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
15b0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
15c0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
15d0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
15e0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
15f0: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
1600: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
1610: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
1620: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
1630: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
1640: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
1650: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1660: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
1670: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
1680: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1690: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
16a0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
16b0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
16c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
16d0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
16e0: 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  pr *p){.  while(
16f0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
1700: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
1710: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 73  FromJoin);.    s
1720: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
1730: 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  eft);.    p = p-
1740: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
1750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1760: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
1770: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
1780: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
1790: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
17a0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
17b0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
17c0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
17d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
17e0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
17f0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
1800: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
1810: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1830: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
1840: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
1850: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
1860: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
1870: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
1880: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1890: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
18a0: 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  *pSrc;.  int i, 
18b0: 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  j;.  pSrc = p->p
18c0: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
18d0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i<pSrc->nSrc-1; 
18e0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
18f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1900: 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Term = &pSrc->a[
1910: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
1920: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 74  rcList_item *pOt
1930: 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  her = &pSrc->a[i
1940: 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  +1];..    if( pT
1950: 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20  erm->pTab==0 || 
1960: 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d 30 20  pOther->pTab==0 
1970: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1980: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
1990: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
19a0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
19b0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
19c0: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
19d0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
19e0: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
19f0: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
1a00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1a10: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1a20: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
1a30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1a40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1a50: 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 55 73  On || pTerm->pUs
1a60: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
1a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a80: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
1a90: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
1aa0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
1ab0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
1ac0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
1ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1af0: 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61 62  ab = pTerm->pTab
1b00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1b10: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1b30: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74   columnIndex(pOt
1b40: 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62 2d  her->pTab, pTab-
1b50: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3e  >aCol[j].zName)>
1b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b70: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54 61  addWhereTerm(pTa
1b80: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1b90: 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  , pTab, pOther->
1ba0: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
1bb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bd0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
1be0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1bf0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1c00: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
1c10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1c20: 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e   && pTerm->pUsin
1c30: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1c40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c50: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c60: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c70: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c80: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c90: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1cb0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1cc0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cd0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1ce0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cf0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1d00: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1d10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d20: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d30: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d40: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d50: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d70: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d80: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d90: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1da0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1db0: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1dc0: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1dd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1de0: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1df0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1e00: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1e10: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1e20: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1e30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1e40: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1e50: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1e60: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1e70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1e80: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1e90: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1ea0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1eb0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1ec0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1ed0: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1ee0: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1ef0: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1f00: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1f10: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1f20: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1f30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1f40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1f50: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1f60: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1f70: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1f80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1f90: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1fa0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1fb0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1fc0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1fd0: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1fe0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1ff0: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
2000: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
2010: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
2020: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2030: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
2040: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
2050: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
2060: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
2070: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
2080: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
2090: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
20a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20c0: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
20d0: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
20e0: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
20f0: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2100: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2110: 65 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  es", pList->a[j]
2120: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
2130: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2150: 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73  ddWhereTerm(pLis
2160: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[j].zName, p
2170: 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68  Term->pTab, pOth
2180: 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57  er->pTab, &p->pW
2190: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
21a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
21c0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
21d0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
21e0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
21f0: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
2200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2210: 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74  ectDelete(Select
2220: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2230: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2240: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2250: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
2260: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2270: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
2280: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2290: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
22c0: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
22d0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
22e0: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
22f0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2300: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2310: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2320: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
2330: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
2340: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2350: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
2360: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67  ** Delete the ag
2370: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2380: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ion from the par
2390: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
23a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
23b0: 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
23c0: 52 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61  Reset(Parse *pPa
23d0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  rse){.  sqliteFr
23e0: 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29  ee(pParse->aAgg)
23f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
2400: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2410: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
2420: 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
2430: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2440: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2450: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2460: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2470: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2480: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2490: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
24a0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
24b0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
24c0: 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69   Vdbe *v, ExprLi
24d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
24e0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
24f0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2500: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2510: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2520: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2530: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
2550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
2560: 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79  Record, pOrderBy
2570: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73  ->nExpr, 0);.  s
2580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2590: 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30  v, OP_SortPut, 0
25a0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
25b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
25c0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
25d0: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
25e0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
25f0: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
2600: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
2610: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
2620: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
2630: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
2640: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
2650: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
2660: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
2670: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
2680: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
2690: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
26a0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
26b0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
26c0: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
26d0: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
26e0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2700: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
2710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2730: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2740: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
2770: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
2780: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
2790: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
27a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
27b0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
27c0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
27d0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
27e0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
27f0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
2800: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
2810: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2820: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2830: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
2840: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
2850: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2860: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
2870: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
2880: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
2890: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
28a0: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
28b0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
28c0: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
28d0: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
28e0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
28f0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
2900: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
2910: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
2920: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
2930: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
2940: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
2950: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
2960: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2970: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2980: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
2990: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
29a0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
29b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
29c0: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
29d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
29e0: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72  r loop */.  char
29f0: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
2a00: 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20      /* affinity 
2a10: 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20  string if eDest 
2a20: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a  is SRT_Union */.
2a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2a50: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 76 3d  int i;..  if( v=
2a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2a70: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
2a80: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
2a90: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
2aa0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
2ab0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
2ac0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
2ad0: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
2ae0: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
2af0: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
2b00: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
2b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
2b20: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a  ->iOffset>=0 ){.
2b30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
2b40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2b50: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b70: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2b80: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
2b90: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+2);.      sql
2ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2bb0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
2bc0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20  ntinue);.    }. 
2bd0: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
2be0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=0 ){.      sql
2bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2c00: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2c10: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2c20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c30: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
2c40: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
2c50: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
2c60: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
2c70: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2c80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ca0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
2cb0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
2cc0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  e{.    nColumn =
2cd0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
2ce0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2cf0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
2d00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2d10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2d20: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
2d30: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2d40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
2d50: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
2d60: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
2d70: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2d80: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
2d90: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
2da0: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
2db0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
2dc0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
2dd0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
2de0: 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63  */.  if( distinc
2df0: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
2e00: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
2e10: 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c  0 ){.#if NULL_AL
2e20: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20  WAYS_DISTINCT.  
2e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e40: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
2e50: 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c   -pEList->nExpr,
2e60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e70: 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23  entAddr(v)+7);.#
2e80: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65 6c  endif.    /* Del
2e90: 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65 20  iberately leave 
2ea0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
2eb0: 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 66  ing off of the f
2ec0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
2ed0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a 2f  OP_MakeRecord */
2ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
2f00: 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d 3e  Record, pEList->
2f10: 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b 0a  nExpr * -1, 0);.
2f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69  ddOp(v, OP_Disti
2f40: 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73  nct, distinct, s
2f50: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f60: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
2f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f80: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c  p(v, OP_Pop, pEL
2f90: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29  ist->nExpr+1, 0)
2fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2fb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
2fc0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
2fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2fe0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
2ff0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
3000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3010: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3020: 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b  y, distinct, 0);
3030: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
3040: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
3050: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
3060: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
3070: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
3080: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3090: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
30a0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
30b0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
30c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
30d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
30f0: 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  umn, NULL_ALWAYS
3100: 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20  _DISTINCT);.    
3110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3120: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
3130: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3150: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
3160: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
3170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3180: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3190: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
31a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31b0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
31c0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
31d0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
31e0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
31f0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
3200: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
3210: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
3220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3230: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3240: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
3250: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3260: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
3270: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3280: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3290: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
32a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
32c0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
32d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
32e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
32f0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
3300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3320: 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d  PutIntKey, iParm
3330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3350: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
3360: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
3370: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
3380: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
3390: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
33a0: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
33b0: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
33c0: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
33d0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
33e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
33f0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
3400: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
3410: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
3420: 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
3430: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3440: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3450: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3460: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3470: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3480: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
3490: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
34a0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
34b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
34c0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50   OP_NotFound, iP
34d0: 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  arm, addr+3);.  
34e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
3500: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
3510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3520: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
3530: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
3540: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
3550: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
3560: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
3570: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
3580: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
3590: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
35a0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
35b0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
35c0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
35d0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
35e0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
35f0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
3600: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
3610: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3620: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
3630: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
3640: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
3650: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
3660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3670: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
3680: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
3690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
36a0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
36b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
36c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36d0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
36e0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
36f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3700: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3710: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3720: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3730: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
3740: 20 63 6f 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a   const *affStr;.
3750: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
3760: 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30   = (iParm>>16)&0
3770: 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66  xFF;.        aff
3780: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
3790: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
37a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66  ->a[0].pExpr, af
37b0: 66 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 53  f);.        affS
37c0: 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  tr = sqlite3Affi
37d0: 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66 29 3b  nityString(aff);
37e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37f0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
3800: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
3810: 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49  affStr, P3_STATI
3820: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
3830: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3840: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
3850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3870: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50  P_PutStrKey, (iP
3880: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
3890: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
38a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
38b0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c  angeP2(v, addr2,
38c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
38d0: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
38e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
38f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
3900: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
3910: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
3920: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
3930: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
3940: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
3950: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
3960: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
3970: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
3980: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
3990: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
39a0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
39b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
39c0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
39d0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
39e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
39f0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3a00: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3a10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
3a40: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
3a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3a60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3a70: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
3a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3a90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3aa0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
3ab0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
3ac0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
3ad0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3ae0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
3af0: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
3b00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
3b10: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3b20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3b40: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
3b50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3b60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3b70: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b90: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
3ba0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
3bb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3bc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3bd0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
3be0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n, 0);.      }. 
3bf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c00: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  }..    /* Invoke
3c10: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
3c20: 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75   handle the resu
3c30: 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75  lts.  The subrou
3c40: 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20  tine itself.    
3c50: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3c60: 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68  e for popping th
3c70: 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66  e results off of
3c80: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
3c90: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3ca0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
3cb0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
3cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ce0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3cf0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
3d00: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3d10: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3d20: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3d30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3d50: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
3d60: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
3d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d80: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
3d90: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
3da0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
3db0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3dc0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
3dd0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
3de0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
3df0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
3e00: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
3e10: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
3e20: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
3e30: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
3e40: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
3e50: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
3e60: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
3e70: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
3e80: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
3e90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
3ea0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
3eb0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
3ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ed0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3ee0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
3ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
3f20: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
3f30: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
3f40: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
3f50: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
3f60: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
3f70: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
3f80: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
3f90: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
3fa0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
3fb0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
3fc0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
3fd0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
3fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
3ff0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
4000: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
4010: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
4020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
4030: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
4040: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4050: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
4060: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
4070: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f  lect *p,       /
4080: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
4090: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
40a0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *v,         /* 
40b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
40c0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
40d0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
40e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40f0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
4100: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
4110: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
4120: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
4130: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
4140: 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  iParm        /* 
4150: 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  Optional paramet
4160: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
4170: 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20  th eDest */.){. 
4180: 20 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69   int end1 = sqli
4190: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
41a0: 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20  (v);.  int end2 
41b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
41c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
41d0: 20 61 64 64 72 3b 0a 20 20 4b 65 79 49 6e 66 6f   addr;.  KeyInfo
41e0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78 70 72 4c   *pInfo;.  ExprL
41f0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
4200: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20   int nCol, i;.  
4210: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
4220: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4230: 65 44 65 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65  eDest==SRT_Sorte
4240: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  r ) return;.  pO
4250: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
4260: 65 72 42 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70  erBy;.  nCol = p
4270: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
4280: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
4290: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
42a0: 70 49 6e 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73  pInfo) + nCol*(s
42b0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
42c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
42d0: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
42e0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
42f0: 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  er = (char*)&pIn
4300: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b  fo->aColl[nCol];
4310: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  .  pInfo->nField
4320: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69   = nCol;.  for(i
4330: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
4340: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f  {.    /* If a co
4350: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4360: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 65   was specified e
4370: 78 70 6c 69 63 69 74 79 2c 20 74 68 65 6e 20 69  xplicity, then i
4380: 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72  t.    ** is stor
4390: 65 64 20 69 6e 20 70 4f 72 64 65 72 42 79 2d 3e  ed in pOrderBy->
43a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65  a[i].zName. Othe
43b0: 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 64  rwise, use the d
43c0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 63 6f  efault.    ** co
43d0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  llation type for
43e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
43f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
4400: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
4410: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4420: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4430: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
4440: 20 20 20 20 69 66 28 20 21 70 49 6e 66 6f 2d 3e      if( !pInfo->
4450: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
4460: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
4470: 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  ] = db->pDfltCol
4480: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
4490: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
44a0: 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
44b0: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
44c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  }.  sqlite3VdbeO
44d0: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30  p3(v, OP_Sort, 0
44e0: 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 49 6e 66  , 0, (char*)pInf
44f0: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
4500: 4e 44 4f 46 46 29 3b 0a 20 20 61 64 64 72 20 3d  NDOFF);.  addr =
4510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4520: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74  p(v, OP_SortNext
4530: 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 69 66  , 0, end1);.  if
4540: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
4550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4570: 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65  mIncr, p->iOffse
4580: 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20  t, addr+4);.    
4590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45a0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
45b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
45c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
45d0: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
45e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  }.  if( p->iLimi
45f0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t>=0 ){.    sqli
4600: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4610: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
4620: 4c 69 6d 69 74 2c 20 65 6e 64 32 29 3b 0a 20 20  Limit, end2);.  
4630: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
4640: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
4650: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
4660: 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a  e SRT_TempTable:
4670: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4690: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
46a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
46b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
46c0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
46d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
46e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
46f0: 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  ntKey, iParm, 0)
4700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4710: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4720: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
4730: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4740: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4750: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4760: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
4770: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4780: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
4790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
47a0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
47b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
47c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
47d0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
47e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
47f0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
4800: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4810: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4820: 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53   1, 0, "n", P3_S
4830: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
4840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4850: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
4860: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4880: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50  P_PutStrKey, (iP
4890: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
48a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
48b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
48c0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
48d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
48e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
48f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4900: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4910: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4930: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4940: 65 6e 64 31 29 3b 0a 20 20 20 20 20 20 62 72 65  end1);.      bre
4950: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4960: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4970: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
4980: 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  broutine: {.    
4990: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
49a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
49b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
49c0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
49d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
49e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
49f0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
4a00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4a10: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4a40: 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a  lumn, -1-i, i);.
4a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4a60: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
4a70: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
4a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a90: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
4aa0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4ab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4ae0: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4af0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4b00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4b10: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
4b20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4b30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4b40: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
4b50: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
4b60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4b90: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
4ba0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
4bb0: 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71 6c  (v, end2);.  sql
4bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bd0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
4bf0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
4c00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
4c10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
4c20: 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 7d  tReset, 0, 0);.}
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
4c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
4c50: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
4c60: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
4c70: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
4c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
4c90: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
4ca0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
4cb0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
4cc0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ller..**.** If t
4cd0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
4ce0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
4cf0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
4d00: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
4d10: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69  rom.** the origi
4d20: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
4d30: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
4d40: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
4d50: 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a  a column..** .**
4d60: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
4d70: 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70   type for an exp
4d80: 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65  ression is eithe
4d90: 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20  r TEXT, NUMERIC 
4da0: 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64  or ANY..** The d
4db0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
4dc0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
4dd0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
4de0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4df0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 50  ar *columnType(P
4e00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
4e10: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4e20: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4e30: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
4e40: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
4e50: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4e60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4e70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4e80: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
4e90: 73 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  st ){.    Table 
4ea0: 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  *pTab;.    int i
4eb0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
4ec0: 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  lumn;.    for(j=
4ed0: 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; j<pTabList->n
4ee0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
4ef0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
4f00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  Expr->iTable; j+
4f10: 2b 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28  +){}.    assert(
4f20: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
4f30: 63 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  c );.    pTab = 
4f40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
4f50: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  Tab;.    if( iCo
4f60: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
4f70: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 61 73  b->iPKey;.    as
4f80: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
4f90: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
4fa0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
4fb0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
4fc0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4fd0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
4fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
4ff0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
5000: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
5010: 20 20 20 20 69 66 28 20 21 7a 54 79 70 65 20 29      if( !zType )
5020: 20 7a 54 79 70 65 20 3d 20 22 22 3b 0a 20 20 20   zType = "";.   
5030: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5040: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 45  switch( sqlite3E
5050: 78 70 72 54 79 70 65 28 70 45 78 70 72 29 20 29  xprType(pExpr) )
5060: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
5070: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20  ITE_AFF_TEXT:   
5080: 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22    zType = "TEXT"
5090: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
50a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
50b0: 46 5f 4e 55 4d 45 52 49 43 3a 20 20 7a 54 79 70  F_NUMERIC:  zTyp
50c0: 65 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20 62  e = "NUMERIC"; b
50d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
50e0: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ult:            
50f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 41        zType = "A
5100: 4e 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  NY";     break;.
5110: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5120: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
5130: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
5140: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
5150: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
5160: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
5170: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
5180: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
5190: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
51a0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
51b0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
51c0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
51d0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
51e0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
51f0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
5200: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
5210: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
5220: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
5230: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
5240: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
5250: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5260: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
5270: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5280: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5290: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
52a0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
52b0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
52c0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c  har *zType = col
52d0: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 20  umnType(pParse, 
52e0: 70 54 61 62 4c 69 73 74 2c 20 70 29 3b 0a 20 20  pTabList, p);.  
52f0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
5300: 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68  tinue;.    /* Th
5310: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
5320: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
5330: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
5340: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a  e, in case the .
5350: 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73      ** schema is
5360: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
5370: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
5380: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
5390: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
53a0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
53b0: 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  v, i+pEList->nEx
53c0: 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65  pr, zType, strle
53d0: 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d  n(zType));.  }.}
53e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
53f0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
5400: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5410: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
5420: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
5430: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
5440: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
5450: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
5460: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
5470: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
5480: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5490: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
54a0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
54b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
54c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
54d0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
54e0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
54f0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
5500: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5510: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5520: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5530: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5540: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5550: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5560: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
5570: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
5580: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
5590: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
55a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
55b0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
55c0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
55d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
55e0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
55f0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
5600: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
5610: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
5620: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
5630: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
5640: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5650: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
5660: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
5670: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
5680: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
5690: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
56a0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
56b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
56c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
56d0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
56e0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
56f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
5700: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5710: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5720: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
5730: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
5740: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
5750: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
5760: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
5770: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
5780: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5790: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
57a0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
57b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
57c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
57d0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
57e0: 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ));.      contin
57f0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
5800: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
5810: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
5820: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
5830: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
5840: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
5850: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
5860: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
5870: 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; j<pTabList->n
5880: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
5890: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
58a0: 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d  ->iTable; j++){}
58b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
58c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
58d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
58e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
58f0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
5900: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5910: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5920: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
5930: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
5940: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5950: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
5960: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
5970: 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44    zCol = "_ROWID
5980: 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _";.      }else{
5990: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
59a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
59b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
59c0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
59d0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
59e0: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
59f0: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
5a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5a10: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
5a20: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
5a30: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
5a40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
5a50: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
5a60: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
5a70: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
5a80: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5a90: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5aa0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5ab0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5ac0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
5ad0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5ae0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
5af0: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
5b00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5b10: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
5b20: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
5b30: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
5b40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5b50: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5b60: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33  (v, i, zName, P3
5b70: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
5b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5ba0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c  lName(v, i, zCol
5bb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5bc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
5bd0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
5be0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
5bf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5c00: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
5c10: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5c20: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
5c30: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
5c40: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
5c50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5c60: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
5c70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5c80: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
5c90: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
5ca0: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
5cb0: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
5cc0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
5cd0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5ce0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
5cf0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
5d00: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
5d10: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
5d20: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
5d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  ;.}../*.** Name 
5d40: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
5d50: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
5d60: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
5d70: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
5d80: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
5d90: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
5da0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
5db0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
5dc0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
5dd0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
5de0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
5df0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
5e00: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
5e10: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
5e20: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
5e30: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
5e40: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
5e50: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
5e60: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
5e70: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
5e80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
5ea0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
5eb0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
5ec0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
5ed0: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
5ee0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
5ef0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
5f00: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
5f10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
5f20: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
5f30: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
5f40: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
5f50: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
5f60: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
5f70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
5f80: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
5f90: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
5fa0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5fb0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
5fc0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
5fd0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a 20  Column *aCol;.. 
5fe0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
5ff0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
6000: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
6010: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6020: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
6030: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
6040: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
6050: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6060: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a  0;.  }.  pTab->z
6070: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
6080: 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  ? sqliteStrDup(z
6090: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
60a0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
60b0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
60c0: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
60d0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
60e0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
60f0: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
6100: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61   aCol = sqliteMa
6110: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61  lloc( sizeof(pTa
6120: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
6130: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->nCol );.  for(
6140: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
6150: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  l; i++){.    Exp
6160: 72 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  r *pR;.    char 
6170: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 45 78 70 72  *zType;.    Expr
6180: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
6190: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
61a0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
61b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 43  Name ){.      aC
61c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  ol[i].zName = sq
61d0: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
61e0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
61f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6200: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
6210: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
6220: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
6230: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
6240: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
6250: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ] ){.      int c
6260: 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nt;.      sqlite
6270: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f  3SetNString(&aCo
6280: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e  l[i].zName, pR->
6290: 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b  token.z, pR->tok
62a0: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  en.n, 0);.      
62b0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
62c0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
62d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
62e0: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
62f0: 2c 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  , aCol[i].zName)
6300: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6310: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
6320: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
6330: 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e  .          sprin
6340: 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b  tf(zBuf,"_%d",++
6350: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cnt);.          
6360: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  n = strlen(zBuf)
6370: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6380: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 61  te3SetNString(&a
6390: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52  Col[i].zName, pR
63a0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74  ->token.z, pR->t
63b0: 6f 6b 65 6e 2e 6e 2c 20 7a 42 75 66 2c 6e 2c 30  oken.n, zBuf,n,0
63c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d  );.          j =
63d0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
63e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
63f0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
6400: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
6410: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
6420: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
6430: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
6440: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
6450: 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  an.n, 0);.    }e
6460: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
6470: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
6480: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63  sprintf(zBuf, "c
6490: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
64a0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
64b0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
64c0: 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a  teStrDup(zBuf);.
64d0: 20 20 20 20 7d 0a 0a 20 20 20 20 7a 54 79 70 65      }..    zType
64e0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
64f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73  columnType(pPars
6500: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  e, pSelect->pSrc
6510: 20 2c 70 29 29 3b 0a 20 20 20 20 70 54 61 62 2d   ,p));.    pTab-
6520: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3d  >aCol[i].zType =
6530: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 54 61 62   zType;.    pTab
6540: 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69  ->aCol[i].affini
6550: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
6560: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 69 66 28  NUMERIC;.    if(
6570: 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
6580: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66  pTab->aCol[i].af
6590: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
65a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
65b0: 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65  pe, strlen(zType
65c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  ));.    }.    pT
65d0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c  ab->aCol[i].pCol
65e0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
65f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6600: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
6610: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
6620: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  ){.      pTab->a
6630: 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70  Col[i].pColl = p
6640: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
6650: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Coll;.    }.  }.
6660: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
6670: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
6680: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  b;.}../*.** For 
6690: 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
66a0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74   statement, do t
66b0: 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a  hree things..**.
66c0: 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20  **    (1)  Fill 
66d0: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
66e0: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
66f0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
6700: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
6710: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
6720: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
6730: 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65  should be scanne
6740: 64 2e 20 20 46 6f 72 20 76 69 65 77 73 2c 0a 2a  d.  For views,.*
6750: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
6760: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
6770: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
6780: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
6790: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
67a0: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
67b0: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
67c0: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
67d0: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
67e0: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
67f0: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
6800: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
6810: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
6820: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
6830: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
6840: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
6850: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
6860: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
6870: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
6880: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
6890: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
68a0: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
68b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
68c0: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
68d0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
68e0: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
68f0: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
6900: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
6910: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
6920: 20 20 28 33 29 20 20 53 63 61 6e 20 74 68 65 20    (3)  Scan the 
6930: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
6940: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6950: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
6960: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
6970: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
6980: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
6990: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
69a0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
69b0: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
69c0: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
69d0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
69e0: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
69f0: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
6a00: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
6a10: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
6a20: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
6a30: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
6a40: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
6a50: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
6a60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
6a70: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
6a80: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
6a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6aa0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
6ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6ac0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6ad0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
6ae0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
6af0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
6b00: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
6b10: 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  Tab;..  if( p==0
6b20: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29   || p->pSrc==0 )
6b30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61   return 1;.  pTa
6b40: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
6b50: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
6b60: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  EList;..  /* Loo
6b70: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
6b80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
6b90: 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  st..  */.  for(i
6ba0: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
6bb0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
6bc0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
6bd0: 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  i].pTab ){.     
6be0: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
6bf0: 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21   has run before!
6c00: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e    No need to con
6c10: 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72  tinue */.      r
6c20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6c30: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6c40: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
6c50: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
6c60: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
6c70: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
6c80: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
6c90: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
6ca0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30  >a[i].pSelect!=0
6cb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
6cc0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6cd0: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
6ce0: 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65    char zFakeName
6cf0: 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70  [60];.        sp
6d00: 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c  rintf(zFakeName,
6d10: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
6d20: 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20  y_%p_",.        
6d30: 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69     (void*)pTabLi
6d40: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6d60: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 54 61  e3SetString(&pTa
6d70: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6d80: 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30  as, zFakeName, 0
6d90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6da0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6db0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
6dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6dd0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
6de0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6df0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
6e30: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
6e40: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6e50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6e60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6e70: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
6e80: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
6e90: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
6ea0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
6eb0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
6ec0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
6ed0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
6ee0: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
6ef0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
6f00: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
6f10: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
6f20: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
6f30: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
6f40: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
6f50: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
6f60: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
6f70: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
6f80: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
6f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fa0: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
6fb0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
6fc0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
6fd0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
6fe0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6ff0: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
7000: 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
7010: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54  eTable(pParse,pT
7020: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
7030: 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  me,pTabList->a[i
7040: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
7050: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
7060: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7070: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
7080: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
7090: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
70a0: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
70b0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
70c0: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
70d0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
70e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
70f0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
7100: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
7110: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
7120: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
7130: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61         /* If pTa
7140: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
7150: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
7160: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
7170: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
7180: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
7190: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
71a0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
71b0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
71c0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
71d0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
71e0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
71f0: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
7200: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
7210: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
7220: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7230: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
7240: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
7250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
7260: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
7270: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
7280: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
7290: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
72a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
72b0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
72c0: 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
72d0: 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
72e0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
72f0: 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
7300: 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  ( sqliteProcessJ
7310: 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
7320: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
7330: 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
7340: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
7350: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
7360: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
7370: 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
7380: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
7390: 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
73a0: 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
73b0: 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
73c0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
73d0: 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
73e0: 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
73f0: 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
7400: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
7410: 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
7420: 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
7430: 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
7440: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
7450: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
7460: 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
7470: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
7480: 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
7490: 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
74a0: 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
74b0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
74c0: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
74d0: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
74e0: 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
74f0: 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
7500: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7510: 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
7520: 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
7530: 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
7540: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
7550: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
7560: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
7570: 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
7580: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
7590: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
75a0: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  ak;.    if( pE->
75b0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
75c0: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e  ->pRight && pE->
75d0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
75e0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  LL.         && p
75f0: 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e  E->pLeft && pE->
7600: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
7610: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
7620: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c  rc = 0;.  if( k<
7630: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
7640: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
7650: 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
7660: 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
7670: 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
7680: 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
7690: 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
76a0: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
76b0: 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
76c0: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
76d0: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
76e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
76f0: 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
7700: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
7710: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
7720: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
7730: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
7740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
7750: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
7760: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
7770: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
7780: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
7790: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
77a0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
77b0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
77c0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
77d0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
77e0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
77f0: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
7800: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
7810: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
7820: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
7830: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
7840: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7850: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
7860: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7870: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
7880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
7890: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
78a0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
78b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
78c0: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
78d0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
78e0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
78f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
7900: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7910: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
7920: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
7930: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
7940: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
7950: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
7960: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
7970: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
7980: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
7990: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
79a0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
79b0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
79c0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
79d0: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
79e0: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
79f0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7a00: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
7a10: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7a20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7a30: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
7a40: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7a50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7a60: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7a70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7a80: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
7a90: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
7aa0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
7ab0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
7ac0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
7ad0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
7ae0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
7af0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7b00: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
7b10: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
7b20: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7b30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7b40: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
7b50: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7b60: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
7b90: 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61  pName->z, zTabNa
7ba0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30  me, pName->n)!=0
7bb0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
7bc0: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e       zTabName[pN
7bd0: 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20  ame->n]!=0) ){. 
7be0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
7bf0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
7c00: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
7c10: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
7c20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7c30: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
7c50: 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74  r *pExpr, *pLeft
7c60: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
7c70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
7c80: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
7c90: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
7ca0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7cb0: 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  & (pTabList->a[i
7cc0: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
7cd0: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
7ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7cf0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61   columnIndex(pTa
7d00: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54  bList->a[i-1].pT
7d10: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
7d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
7d30: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
7d40: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
7d50: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
7d60: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
7d70: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
7d80: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
7d90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7da0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7db0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
7dc0: 28 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ( i>0 && sqlite3
7dd0: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62  IdListIndex(pTab
7de0: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73  List->a[i-1].pUs
7df0: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
7e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7e10: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
7e20: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
7e30: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
7e40: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
7e50: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
7e60: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
7e70: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
7e80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7e90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7ea0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7eb0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
7ec0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
7ed0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7ee0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
7ef0: 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
7f00: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
7f10: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61  t->token.z = zNa
7f20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7f30: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20  pRight->token.n 
7f40: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
7f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7f60: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  ght->token.dyn =
7f70: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
7f80: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  if( zTabName && 
7f90: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
7fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7fb0: 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
7fc0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
7fd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
7fe0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
7ff0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
8000: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
8010: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8020: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
8030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8040: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
8050: 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b  en.z = zTabName;
8060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8070: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
8080: 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29  strlen(zTabName)
8090: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
80a0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pLeft->token.dyn
80b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
80c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
80d0: 72 69 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45  ring((char**)&pE
80e0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61  xpr->span.z, zTa
80f0: 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d  bName, ".", zNam
8100: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
8110: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
8120: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70  .n = strlen(pExp
8130: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
8140: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8150: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8170: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
8180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8190: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
81a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
81b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
81c0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
81d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
81e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
81f0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
8200: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
8210: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
8220: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8230: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
8240: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8250: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70  stAppend(pNew, p
8260: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
8270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8280: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
8290: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
82a0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b      if( pName ){
82b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
82c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
82d0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
82e0: 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d 65 29  ble: %T", pName)
82f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8300: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8310: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8320: 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
8330: 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
8340: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8350: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
8360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8370: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8390: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
83a0: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
83b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
83c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
83d0: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
83e0: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
83f0: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
8400: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
8410: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
8420: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
8430: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
8440: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
8450: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
8460: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
8470: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
8480: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
8490: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
84a0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
84b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
84c0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
84d0: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
84e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
84f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8500: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
8510: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8520: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
8530: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
8540: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
8550: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
8560: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
8570: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
8580: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
8590: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
85a0: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
85b0: 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64 69  .** If the bindi
85c0: 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f  ngs are not remo
85d0: 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 65  ved, then the Se
85e0: 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70  lect.pSrc->a[].p
85f0: 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c  Tab field.** wil
8600: 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
8610: 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61  ng to a dealloca
8620: 74 65 64 20 54 61 62 6c 65 20 73 74 72 75 63 74  ted Table struct
8630: 75 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a 2a  ure after the.**
8640: 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72 65   DROP and a core
8650: 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72 20  dump will occur 
8660: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
8670: 65 20 56 49 45 57 20 69 73 20 75 73 65 64 2e 0a  e VIEW is used..
8680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
8690: 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65  electUnbind(Sele
86a0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
86b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
86c0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61   = p->pSrc;.  Ta
86d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
86e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
86f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8700: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
8710: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
8720: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
8730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8740: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
8750: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8760: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
8770: 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  0, pTab);.      
8780: 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  }.      pSrc->a[
8790: 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  i].pTab = 0;.   
87a0: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
87b0: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
87c0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
87d0: 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61  ctUnbind(pSrc->a
87e0: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
87f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8800: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8810: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
8820: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
8830: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
8840: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
8850: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
8860: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
8870: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
8880: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
8890: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
88a0: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
88b0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
88c0: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
88d0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
88e0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
88f0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
8900: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
8910: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
8920: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
8930: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8940: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
8950: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
8960: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
8970: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
8980: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
8990: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
89a0: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
89b0: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
89c0: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
89d0: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
89e0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
89f0: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
8a00: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
8a10: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
8a20: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
8a30: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
8a40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8a50: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
8a60: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
8a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
8a90: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
8aa0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
8ab0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
8ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
8ad0: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
8ae0: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
8af0: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
8b00: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
8b10: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
8b20: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
8b30: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
8b40: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8b60: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
8b70: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
8b80: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
8b90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
8ba0: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
8bb0: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
8bc0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
8bd0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8be0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8bf0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
8c00: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
8c10: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
8c20: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
8c30: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
8c40: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8c50: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
8c60: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
8c70: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
8c80: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
8c90: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
8ca0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8cb0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
8cc0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
8cd0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
8ce0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
8cf0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
8d00: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
8d10: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
8d20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8d30: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
8d40: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
8d50: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
8d60: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8d80: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
8d90: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8da0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
8db0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
8dc0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
8dd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8de0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
8df0: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
8e00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
8e10: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
8e20: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
8e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8e40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
8e50: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
8e60: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
8e70: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
8e80: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
8e90: 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73       iCol, pELis
8ea0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
8eb0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
8ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ed0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73  }.      if( !mus
8ee0: 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74  tComplete ) cont
8ef0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c  inue;.      iCol
8f00: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
8f10: 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26  r(j=0; iCol<0 &&
8f20: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
8f30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
8f40: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ( pEList->a[j].z
8f50: 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d  Name && (pE->op=
8f60: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70  =TK_ID || pE->op
8f70: 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a  ==TK_STRING) ){.
8f80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8f90: 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20  ame, *zLabel;.  
8fa0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
8fb0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
8fc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8fd0: 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  ( pE->token.z );
8fe0: 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20  .        zLabel 
8ff0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
9000: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d  pE->token.z, pE-
9010: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
9020: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
9030: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
9040: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9050: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
9060: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
9070: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
9080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9090: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
90a0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
90b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
90c0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
90d0: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
90e0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
90f0: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9110: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
9120: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
9130: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
9140: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
9150: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
9160: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
9170: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
9180: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
9190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
91a0: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
91b0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
91c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
91d0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
91e0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
91f0: 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74  mber %d does not
9200: 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c   match any resul
9210: 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b  t column", i+1);
9220: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
9230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9240: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9250: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
9260: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
9270: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
9280: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
9290: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
92a0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
92b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
92c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
92d0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
92e0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
92f0: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
9300: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
9310: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
9320: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9330: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
9340: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9350: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
9360: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
9370: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9380: 76 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 2a  v;.}..#if 0  /**
9390: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
93a0: 20 6e 65 65 64 73 20 64 65 6c 65 74 69 6e 67 20   needs deleting 
93b0: 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  *****/.static vo
93c0: 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 41 66  id multiSelectAf
93d0: 66 69 6e 69 74 79 28 53 65 6c 65 63 74 20 2a 70  finity(Select *p
93e0: 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
93f0: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21   int i;..  if( !
9400: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 75  p ) return;.  mu
9410: 6c 74 69 53 65 6c 65 63 74 41 66 66 69 6e 69 74  ltiSelectAffinit
9420: 79 28 70 2d 3e 70 50 72 69 6f 72 2c 20 7a 41 66  y(p->pPrior, zAf
9430: 66 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f);..  for(i=0; 
9440: 69 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  i<p->pEList->nEx
9450: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
9460: 28 20 7a 41 66 66 5b 69 5d 3d 3d 27 5c 30 27 20  ( zAff[i]=='\0' 
9470: 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 5d  ){.      zAff[i]
9480: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9490: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
94a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
94b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
94c0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  f../*.** Compute
94d0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
94e0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
94f0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
9500: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69  ed on the.** nLi
9510: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
9520: 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20  fields.  nLimit 
9530: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
9540: 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   the integers.**
9550: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
9560: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
9570: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
9580: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
9590: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
95a0: 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64  s.  Or that hold
95b0: 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f   -1 and 0 if tho
95c0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
95d0: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d  omitted..** iLim
95e0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
95f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
9600: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
9610: 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  umbers for.** co
9620: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
9630: 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
9640: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
9650: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
9660: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
9670: 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74  set, then iLimit
9680: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
9690: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
96a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
96b0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
96c0: 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   if iLimit and i
96d0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
96e0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
96f0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
9700: 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  y nLimit and nOf
9710: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
9720: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
9730: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
9740: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
9750: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
9760: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
9770: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
9780: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
9790: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
97a0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d  .** Only if nLim
97b0: 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74  it>=0 or nOffset
97c0: 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  >0 do the limit 
97d0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
97e0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
97f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
9800: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
9810: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
9820: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
9830: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
9840: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
9850: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
9860: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
9870: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
9880: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
9890: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
98a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
98b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a  lect *p){.  /* .
98c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70    ** If the comp
98d0: 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69  arison is p->nLi
98e0: 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49  mit>0 then "LIMI
98f0: 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20  T 0" shows.  ** 
9900: 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73  all rows.  It is
9910: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20   the same as no 
9920: 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f  limit. If the co
9930: 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a  mparision is.  *
9940: 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74  * p->nLimit>=0 t
9950: 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68  hen "LIMIT 0" sh
9960: 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c  ow no rows at al
9970: 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  l..  ** "LIMIT -
9980: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
9990: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
99a0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
99b0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
99c0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
99d0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
99e0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
99f0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
9a00: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
9a10: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
9a20: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
9a30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
9a40: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
9a50: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
9a60: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
9a70: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9a80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9a90: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
9aa0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
9ab0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ac0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
9ad0: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
9ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9af0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
9b00: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d  iMem, 1);.    p-
9b10: 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a  >iLimit = iMem;.
9b20: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66    }.  if( p->nOf
9b30: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
9b40: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
9b50: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
9b60: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9b70: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9b80: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
9b90: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
9ba0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9bb0: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f  _Integer, -p->nO
9bc0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
9bd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9be0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
9bf0: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d  iMem, 1);.    p-
9c00: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >iOffset = iMem;
9c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9c20: 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74  nerate VDBE inst
9c30: 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69  ructions that wi
9c40: 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  ll open a transi
9c50: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
9c60: 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  * will be used f
9c70: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74  or an index or t
9c80: 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65  o store keyed re
9c90: 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70  sults for a comp
9ca0: 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20  ound.** select. 
9cb0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9cc0: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
9cd0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65  t table that nee
9ce0: 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ds a.** KeyInfo 
9cf0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
9d00: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9d10: 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  s in the KeyInfo
9d20: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
9d30: 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20  * by the result 
9d40: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
9d50: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  T statement in t
9d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
9d70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  nt..**.** Specif
9d80: 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75  ically, this rou
9d90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
9da0: 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20  o open an index 
9db0: 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53  table for.** DIS
9dc0: 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e  TINCT, UNION, IN
9dd0: 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45  TERSECT and EXCE
9de0: 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  PT select statem
9df0: 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a  ents (but not .*
9e00: 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a  * UNION ALL)..**
9e10: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77  .** Make the new
9e20: 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61   table a KeyAsDa
9e30: 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41  ta table if keyA
9e40: 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a  sData is true..*
9e50: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9e60: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61  eturned is the a
9e70: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
9e80: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
9e90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
9ea0: 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64   int openTempInd
9eb0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
9ec0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
9ed0: 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73   iTab, int keyAs
9ee0: 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  Data){.  KeyInfo
9ef0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
9f00: 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c  t nColumn;.  sql
9f10: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9f20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
9f30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9f40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
9f50: 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 66 69 6c  addr;..  if( fil
9f60: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
9f70: 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
9f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9f90: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c  nColumn = p->pEL
9fa0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b  ist->nExpr;.  pK
9fb0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
9fc0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
9fd0: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e  KeyInfo)+nColumn
9fe0: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
9ff0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  ) );.  if( pKeyI
a000: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
a010: 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  0;.  pKeyInfo->e
a020: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
a030: 3e 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  >enc;.  pKeyInfo
a040: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75  ->nField = nColu
a050: 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  mn;.  for(i=0; i
a060: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
a070: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
a080: 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
a090: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
a0a0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
a0b0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a0c0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61  if( !pKeyInfo->a
a0d0: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
a0e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
a0f0: 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  [i] = db->pDfltC
a100: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
a110: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a120: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
a130: 6e 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20  nTemp, iTab, 0, 
a140: 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b  .      (char*)pK
a150: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
a160: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
a170: 66 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a  f( keyAsData ){.
a180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a190: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
a1a0: 44 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a  Data, iTab, 1);.
a1b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
a1c0: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  r;.}..static int
a1d0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e   multiSelectOpen
a1e0: 54 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20  TempAddr(Select 
a1f0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 49 64  *p, int addr, Id
a200: 4c 69 73 74 20 2a 2a 70 70 4f 70 65 6e 54 65 6d  List **ppOpenTem
a210: 70 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 70  p){.  if( !p->pp
a220: 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20  OpenTemp ){.    
a230: 2a 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71  *ppOpenTemp = sq
a240: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
a250: 64 28 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  d(0, 0);.    p->
a260: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 70 4f  ppOpenTemp = ppO
a270: 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 65 6c 73 65  penTemp;.  }else
a280: 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 4f 70 65 6e  {.    *p->ppOpen
a290: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64  Temp = sqlite3Id
a2a0: 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70  ListAppend(*p->p
a2b0: 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  pOpenTemp, 0);. 
a2c0: 20 7d 0a 20 20 69 66 28 20 21 28 2a 70 2d 3e 70   }.  if( !(*p->p
a2d0: 70 4f 70 65 6e 54 65 6d 70 29 20 29 7b 0a 20 20  pOpenTemp) ){.  
a2e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 28 2a 70  NOMEM;.  }.  (*p
a300: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 29 2d 3e 61  ->ppOpenTemp)->a
a310: 5b 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  [(*p->ppOpenTemp
a320: 29 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20  )->nId-1].idx = 
a330: 61 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  addr;.  return S
a340: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
a350: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
a360: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
a370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a380: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
a390: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
a3a0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
a3b0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
a3c0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
a3d0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
a3e0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
a3f0: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ol);.  }.  if( !
a400: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
a410: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
a420: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
a430: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
a440: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
a450: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
a460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a470: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
a480: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
a490: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
a4a0: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
a4b0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
a4c0: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
a4d0: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
a4e0: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
a4f0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
a500: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
a510: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
a520: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
a530: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
a540: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
a550: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
a560: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
a570: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
a580: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
a590: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
a5a0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
a5b0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
a5c0: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
a5d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
a5e0: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
a5f0: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
a600: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
a610: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
a620: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
a630: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
a640: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
a650: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
a660: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
a670: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
a680: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
a690: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
a6a0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
a6b0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
a6c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a6d0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
a6e0: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
a6f0: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
a700: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
a710: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
a720: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
a730: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
a740: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
a750: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
a760: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
a770: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
a780: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
a790: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
a7a0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
a7b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
a7c0: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
a7d0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
a7e0: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
a7f0: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
a800: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
a810: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
a820: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
a830: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
a840: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
a850: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
a860: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
a870: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
a880: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
a890: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
a8a0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
a8b0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
a8c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
a8d0: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
a8e0: 2c 20 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  , .  int eDest, 
a8f0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 0a 20  .  int iParm, . 
a900: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
a910: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
a920: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
a930: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
a940: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
a950: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
a960: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
a970: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
a980: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
a990: 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e  Prior;     /* An
a9a0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
a9b0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
a9c0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
a9d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
a9e0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a9f0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
aa00: 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65   IdList *pOpenTe
aa10: 6d 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61  mp = 0;..  /* Ma
aa20: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
aa30: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
aa40: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
aa50: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
aa60: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
aa70: 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  st SELECT in the
aa80: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
aa90: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
aaa0: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
aab0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
aac0: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
aad0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
aae0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
aaf0: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
ab00: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
ab10: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
ab20: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ab30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ab40: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
ab50: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
ab60: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
ab70: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
ab80: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
ab90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
aba0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
abb0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
abc0: 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d  pPrior->nLimit>=
abd0: 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f 66  0 || pPrior->nOf
abe0: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
abf0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ac00: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
ac10: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
ac20: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
ac30: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
ac40: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
ac50: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
ac60: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
ac70: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
ac80: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
ac90: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
aca0: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
acb0: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
acc0: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
acd0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ace0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
acf0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
ad00: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
ad10: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
ad20: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
ad30: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
ad40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
ad50: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
ad60: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
ad70: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
ad80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ad90: 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
ada0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
adb0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
adc0: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
add0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ade0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
adf0: 20 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73   iParm, p->pELis
ae00: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 65  t->nExpr);.    e
ae10: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
ae20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
ae30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
ae40: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
ae50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ae60: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
ae70: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
ae80: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
ae90: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
aea0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
aeb0: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69     pPrior->nLimi
aec0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
aed0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e         pPrior->n
aee0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
aef0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  set;.        pPr
af00: 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20  ior->ppOpenTemp 
af10: 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b  = p->ppOpenTemp;
af20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
af30: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
af40: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
af50: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
af60: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
af70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
af80: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
af90: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
afa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
afb0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
afc0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
afd0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
afe0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
aff0: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
b000: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
b010: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
b020: 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65         p->nOffse
b030: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
b040: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
b050: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
b060: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
b070: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
b080: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
b090: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
b0a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b0b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b0c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b0d0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0f0: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
b100: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
b110: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
b120: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
b130: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b140: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
b150: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
b160: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
b170: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
b180: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
b190: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
b1a0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
b1b0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
b1c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
b1d0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
b1e0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
b1f0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
b200: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
b210: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
b220: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
b230: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
b240: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  /.      int nLim
b250: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20  it, nOffset; /* 
b260: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
b270: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
b280: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
b290: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
b2a0: 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52  erBy;  /* The OR
b2b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
b2c0: 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45  r the right SELE
b2d0: 43 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  CT */.      int 
b2e0: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
b2f0: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
b300: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
b310: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
b320: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
b330: 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72  riorOp && p->pOr
b340: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e  derBy==0 && p->n
b350: 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f  Limit<0 && p->nO
b360: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
b370: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
b380: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
b390: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
b3a0: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
b3b0: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
b3c0: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
b3d0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
b3e0: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
b3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
b400: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
b410: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
b420: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b430: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
b440: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
b450: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
b460: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b470: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
b480: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b490: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b4a0: 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20  rBy .        && 
b4b0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
b4c0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
b4d0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p->pOrderBy, uni
b4e0: 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20  onTab, 1) ){.   
b4f0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
b500: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
b510: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b530: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b540: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b550: 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54  OpenTemp, unionT
b560: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
b570: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  if( p->op!=TK_AL
b580: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  L ){.          r
b590: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
b5a0: 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61  penTempAddr(p, a
b5b0: 64 64 72 2c 20 26 70 4f 70 65 6e 54 65 6d 70 29  ddr, &pOpenTemp)
b5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b5d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
b5f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
b600: 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  nd;.          }.
b610: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b620: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b630: 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f  _KeyAsData, unio
b640: 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20  nTab, 1);.      
b650: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
b660: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
b670: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b680: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
b690: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
b6a0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
b6b0: 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  */.      pPrior-
b6c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
b6d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20  >ppOpenTemp;.   
b6e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b6f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
b700: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
b710: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
b720: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
b730: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
b740: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b750: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
b760: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
b770: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
b780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b790: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
b7a0: 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62  olumns, unionTab
b7b0: 2c 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  , pPrior->pEList
b7c0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
b7d0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
b7e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
b7f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
b800: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
b810: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
b820: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
b830: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
b840: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
b850: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
b860: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
b870: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
b880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
b890: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
b8a0: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
b8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b8c0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
b8d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
b8e0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
b8f0: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
b900: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
b910: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
b920: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
b930: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
b940: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
b950: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
b960: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
b970: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b980: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b990: 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  , op, unionTab, 
b9a0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
b9b0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
b9c0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
b9d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
b9e0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e  derBy;.      p->
b9f0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
ba00: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
ba10: 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  t = nOffset;.   
ba20: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ba30: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ba40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ba50: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
ba60: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
ba70: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
ba80: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
ba90: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
baa0: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
bab0: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
bac0: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
bad0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
bae0: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
baf0: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
bb00: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
bb10: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
bb20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bb30: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bb40: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
bb50: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
bb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
bb70: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
bb80: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
bb90: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
bba0: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
bbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
bbc0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
bbd0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
bbe0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
bbf0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
bc00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bc10: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
bc20: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
bc30: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
bc40: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
bc50: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
bc60: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
bc70: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
bc80: 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
bc90: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
bca0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
bcb0: 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
bcc0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
bcd0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
bd00: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
bd30: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
bd40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
bd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bd60: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
bd70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bd80: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
bd90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bda0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bdb0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
bdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bdd0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
bde0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
bdf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
be00: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
be10: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
be20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
be40: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
be50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
be60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
be70: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
be80: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
be90: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
bea0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
beb0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
bec0: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e     int nLimit, n
bed0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
bee0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f  t addr;..      /
bef0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
bf00: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
bf10: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
bf20: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
bf30: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
bf40: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
bf50: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
bf60: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
bf70: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
bf80: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
bf90: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
bfa0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
bfb0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
bfc0: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
bfd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
bfe0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
bff0: 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72  derBy && matchOr
c000: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
c010: 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72  arse,p,p->pOrder
c020: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
c030: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c040: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c050: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c060: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72     }..      addr
c070: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c080: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
c090: 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  mp, tab1, 0);.  
c0a0: 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
c0b0: 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72  lectOpenTempAddr
c0c0: 28 70 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e  (p, addr, &pOpen
c0d0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Temp);.      if(
c0e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c0f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c100: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c130: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
c140: 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20   tab1, 1);.     
c150: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c160: 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
c170: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
c180: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
c190: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
c1a0: 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
c1b0: 2a 2f 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  */.      pPrior-
c1c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
c1d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 20  >ppOpenTemp;.   
c1e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c1f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c200: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
c210: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
c220: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
c230: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c240: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c250: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
c260: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c270: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
c280: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
c290: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
c2a0: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
c2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c2c0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
c2d0: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
c2e0: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
c2f0: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
c300: 2c 20 61 64 64 72 2c 20 26 70 4f 70 65 6e 54 65  , addr, &pOpenTe
c310: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
c320: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c330: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c340: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
c360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c370: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
c380: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ab2, 1);.      p
c390: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c3a0: 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e      nLimit = p->
c3b0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
c3c0: 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >nLimit = -1;.  
c3d0: 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d      nOffset = p-
c3e0: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >nOffset;.      
c3f0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
c400: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c410: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c420: 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   p, SRT_Union, t
c430: 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab2, 0, 0, 0, af
c440: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
c450: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c460: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
c470: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
c480: 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73  >nOffset = nOffs
c490: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
c4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c4b0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c4c0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
c4d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
c4e0: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
c4f0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
c500: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
c510: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
c520: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c530: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c540: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
c550: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
c560: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ack ){.        g
c570: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
c580: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
c590: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
c5a0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
c5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c5c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c5d0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
c5e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
c610: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
c620: 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  ak);.      compu
c630: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c640: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c650: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
c660: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c670: 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31  OP_FullKey, tab1
c680: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c6a0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
c6b0: 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
c6c0: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
c6d0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
c6e0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
c6f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
c700: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
c730: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
c740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
c760: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
c770: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c780: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
c790: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c7a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c7c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
c7d0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
c7e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c7f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
c800: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
c810: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c820: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c830: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
c840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c850: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c860: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
c870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c880: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
c890: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
c8a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c8b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c8c0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
c8d0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
c8e0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
c8f0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
c900: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
c910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c920: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
c930: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
c940: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
c950: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
c960: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
c970: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
c980: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
c990: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
c9a0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
c9b0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c9c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
c9d0: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
c9e0: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
c9f0: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
ca00: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
ca10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
ca20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4b 65     int i;.    Ke
ca30: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
ca40: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
ca50: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
ca60: 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c  +nCol*sizeof(Col
ca70: 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28  lSeq*));.    if(
ca80: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
ca90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
caa0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
cab0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
cac0: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
cad0: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70  KeyInfo->enc = p
cae0: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
caf0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
cb00: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
cb10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
cb20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
cb30: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
cb40: 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
cb50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
cb60: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
cb70: 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  !pKeyInfo->aColl
cb80: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  [i] ){.        p
cb90: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
cba0: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ] = pParse->db->
cbb0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
cbc0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
cbd0: 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70  r(i=0; pOpenTemp
cbe0: 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d   && i<pOpenTemp-
cbf0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
cc00: 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28    int p3type = (
cc10: 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f  i==0?P3_KEYINFO_
cc20: 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e  HANDOFF:P3_KEYIN
cc30: 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  FO);.      int a
cc40: 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d  ddr = pOpenTemp-
cc50: 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20  >a[i].idx;.     
cc60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
cc70: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
cc80: 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
cc90: 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a  p3type);.    }..
cca0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
ccb0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rBy ){.      for
ccc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65  (i=0; i<p->pOrde
ccd0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
cce0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
ccf0: 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65  pExpr = p->pOrde
cd00: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
cd10: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
cd20: 4e 61 6d 65 20 3d 20 70 2d 3e 70 4f 72 64 65 72  Name = p->pOrder
cd30: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  By->a[i].zName;.
cd40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cd50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
cd60: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
cd70: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
cd80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
cd90: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
cda0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
cdb0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
cdc0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
cdd0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
cde0: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
cdf0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
ce00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ce10: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
ce20: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70  KeyInfo->aColl[p
ce30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
ce40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ce50: 7d 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65  }.      generate
ce60: 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
ce70: 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74   p, v, p->pEList
ce80: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
ce90: 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  iParm);.    }.. 
cea0: 20 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d     if( !pOpenTem
ceb0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
cec0: 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55  is happens for U
ced0: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
cee0: 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73  ER BY */.      s
cef0: 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e  qliteFree(pKeyIn
cf00: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fo);.    }.  }..
cf10: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cf20: 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d  :.  if( pOpenTem
cf30: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
cf40: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70  IdListDelete(pOp
cf50: 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70  enTemp);.  }.  p
cf60: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30  ->ppOpenTemp = 0
cf70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cf80: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
cf90: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
cfa0: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
cfb0: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
cfc0: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
cfd0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
cfe0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
cff0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
d000: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
d010: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
d020: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
d030: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
d040: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
d050: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
d060: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
d070: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
d080: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
d090: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
d0a0: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
d0b0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
d0c0: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
d0d0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
d0e0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
d0f0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
d100: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
d110: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
d120: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
d130: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
d140: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d150: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
d160: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
d170: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
d180: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
d190: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
d1a0: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
d1b0: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
d1c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d1d0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
d1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d1f0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
d200: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
d210: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
d220: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
d230: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
d240: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
d250: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
d260: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
d270: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
d280: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
d290: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
d2a0: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
d2b0: 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
d2c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
d2d0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
d2e0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
d2f0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
d300: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
d310: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d320: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
d330: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
d340: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
d350: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
d360: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
d370: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
d380: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
d390: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
d3a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
d3b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
d3c0: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
d3d0: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
d3e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
d3f0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
d400: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
d410: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
d420: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
d430: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65  lite3ExprDup(pNe
d440: 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
d450: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d460: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
d470: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
d480: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
d490: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
d4a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d4b0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
d4c0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
d4d0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
d4e0: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
d4f0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
d500: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
d510: 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
d520: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
d530: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
d540: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
d550: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
d560: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
d570: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
d580: 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
d590: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
d5a0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
d5b0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
d5c0: 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a  w->span);.    }.
d5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
d5e0: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
d5f0: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
d600: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
d610: 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
d620: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
d630: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
d640: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
d650: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
d660: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
d670: 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70  c void .substExp
d680: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
d690: 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
d6a0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
d6b0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d6c0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d6d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d6e0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
d6f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
d700: 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
d710: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
d720: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
d730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d740: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
d750: 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
d760: 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
d770: 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
d780: 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
d790: 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
d7a0: 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
d7b0: 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
d7c0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
d7d0: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
d7e0: 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
d7f0: 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
d800: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
d810: 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
d820: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
d830: 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
d840: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
d850: 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
d860: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
d870: 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
d880: 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
d890: 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
d8a0: 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
d8b0: 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
d8c0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
d8d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
d8e0: 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
d8f0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
d900: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
d910: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
d920: 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
d930: 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
d940: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
d950: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
d960: 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
d970: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
d980: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
d990: 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
d9a0: 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
d9b0: 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
d9c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
d9d0: 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
d9e0: 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
d9f0: 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
da00: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
da10: 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
da20: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
da30: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
da40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
da50: 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
da60: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
da70: 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
da80: 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
da90: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
daa0: 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
dab0: 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
dac0: 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
dad0: 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
dae0: 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
daf0: 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
db00: 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
db10: 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
db20: 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
db30: 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
db40: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
db50: 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
db60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
db70: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
db80: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
db90: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
dba0: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
dbb0: 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
dbc0: 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
dbd0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
dbe0: 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
dbf0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
dc00: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
dc10: 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
dc20: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
dc30: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
dc40: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
dc50: 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20   join, or.**    
dc60: 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79      the subquery
dc70: 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61   is not itself a
dc80: 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20   join.  (Ticket 
dc90: 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  #306).**.**   (4
dca0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
dcb0: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
dcc0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
dcd0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
dce0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
dcf0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
dd00: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
dd10: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
dd20: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
dd30: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
dd40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
dd50: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
dd60: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
dd70: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
dd80: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
dd90: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
dda0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
ddb0: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
ddc0: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
ddd0: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
dde0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ddf0: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
de00: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
de10: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
de20: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
de30: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
de40: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
de50: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
de60: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
de70: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
de80: 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
de90: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
dea0: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
deb0: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
dec0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
ded0: 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
dee0: 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
def0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
df00: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
df10: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
df20: 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
df30: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
df40: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
df50: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
df60: 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f  term of a LEFT O
df70: 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65  UTER JOIN or the
df80: 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
df90: 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
dfa0: 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64   clause.  (added
dfb0: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29   by ticket #350)
dfc0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
dfd0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
dfe0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
dff0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
e000: 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
e010: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
e020: 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
e030: 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
e040: 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
e050: 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
e060: 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
e070: 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
e080: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
e090: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
e0a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
e0b0: 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
e0c0: 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
e0d0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
e0e0: 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
e0f0: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
e100: 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
e110: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
e120: 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
e130: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e140: 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
e150: 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
e160: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
e170: 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
e180: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
e190: 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
e1a0: 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
e1b0: 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
e1c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e1d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
e1e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
e1f0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
e200: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
e210: 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
e220: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
e230: 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
e240: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
e250: 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
e260: 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
e270: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
e280: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
e290: 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
e2a0: 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
e2b0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
e2c0: 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
e2d0: 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
e2e0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
e2f0: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
e300: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
e310: 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
e320: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
e330: 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
e340: 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
e350: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
e360: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
e370: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
e380: 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
e390: 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
e3a0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
e3b0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
e3c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e3d0: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
e3e0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e3f0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
e400: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
e410: 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
e420: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
e430: 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
e440: 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
e450: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  /.  int i;.  Exp
e460: 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a  r *pWhere;..  /*
e470: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
e480: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
e490: 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
e4a0: 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
e4b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
e4c0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
e4d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
e4e0: 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
e4f0: 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
e500: 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
e510: 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  ub = pSrc->a[iFr
e520: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61  om].pSelect;.  a
e530: 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
e540: 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
e550: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
e560: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e570: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
e580: 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
e590: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75   return 0;.  pSu
e5a0: 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
e5b0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
e5c0: 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53  bSrc );.  if( pS
e5d0: 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
e5e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e5f0: 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e   (pSub->isDistin
e600: 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d  ct || pSub->nLim
e610: 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63  it>=0) &&  (pSrc
e620: 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
e630: 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
e640: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
e650: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
e660: 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26   p->nLimit>=0) &
e670: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
e680: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e690: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
e6a0: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
e6b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
e6c0: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
e6d0: 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
e6e0: 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
e6f0: 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
e700: 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
e710: 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
e720: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
e730: 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
e740: 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
e750: 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
e760: 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
e770: 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
e780: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
e790: 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
e7a0: 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
e7b0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
e7c0: 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
e7d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
e7e0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
e7f0: 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
e800: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
e810: 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
e820: 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
e830: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
e840: 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20  rc>1 && iFrom>0 
e850: 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
e860: 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
e870: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
e880: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e890: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
e8a0: 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
e8b0: 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
e8c0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
e8d0: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
e8e0: 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
e8f0: 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
e900: 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
e910: 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
e920: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
e930: 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
e940: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
e950: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
e960: 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
e970: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
e980: 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
e990: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
e9a0: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
e9b0: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
e9c0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
e9d0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
e9e0: 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
e9f0: 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
ea00: 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
ea10: 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
ea20: 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
ea30: 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
ea40: 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
ea50: 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
ea60: 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
ea70: 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
ea80: 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
ea90: 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
eaa0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
eab0: 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70  )!=0 .      && p
eac0: 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29  Sub->pWhere!=0 )
ead0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
eae0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
eaf0: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
eb00: 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
eb10: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
eb20: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
eb30: 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
eb40: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
eb50: 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e in the outer q
eb60: 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  uery..  */..  /*
eb70: 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65   Move all of the
eb80: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
eb90: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
eba0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
ebb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
ebc0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
ebd0: 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
ebe0: 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
ebf0: 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
ec00: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
ec10: 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
ec20: 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
ec30: 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
ec40: 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
ec50: 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
ec60: 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
ec70: 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
ec80: 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
ec90: 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
eca0: 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
ecb0: 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
ecc0: 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
ecd0: 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
ece0: 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
ecf0: 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
ed00: 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
ed10: 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
ed20: 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
ed30: 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  /.  iParent = pS
ed40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75  rc->a[iFrom].iCu
ed50: 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
ed60: 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
ed70: 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
ed80: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
ed90: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
eda0: 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  ntype;..    if( 
edb0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
edc0: 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69  Tab && pSrc->a[i
edd0: 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72  From].pTab->isTr
ede0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
edf0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
ee00: 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69  ble(0, pSrc->a[i
ee10: 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20  From].pTab);.   
ee20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
ee30: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
ee40: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
ee50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63   sqliteFree(pSrc
ee60: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65  ->a[iFrom].zName
ee70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
ee80: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
ee90: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
eea0: 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
eeb0: 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
eec0: 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
eed0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
eee0: 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
eef0: 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
ef00: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
ef10: 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
ef20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
ef30: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
ef40: 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
ef50: 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
ef60: 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
ef70: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
ef80: 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
ef90: 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
efa0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
efb0: 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
efc0: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
efd0: 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
efe0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
eff0: 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
f000: 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
f010: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
f020: 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
f030: 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
f040: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
f050: 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
f060: 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
f070: 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
f080: 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
f090: 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
f0a0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
f0b0: 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
f0c0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
f0d0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
f0e0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
f0f0: 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
f100: 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
f110: 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
f120: 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
f130: 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
f160: 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
f170: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
f180: 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
f190: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f1a0: 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
f1b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f1c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
f1d0: 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
f1e0: 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
f1f0: 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
f200: 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
f210: 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
f220: 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
f230: 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
f240: 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
f250: 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
f260: 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
f270: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
f280: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
f290: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f2a0: 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
f2b0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
f2c0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
f2d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f2e0: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
f2f0: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
f300: 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
f310: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
f320: 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
f330: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
f340: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
f350: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
f360: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
f370: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
f380: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
f390: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
f3a0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
f3b0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
f3c0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
f3d0: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
f3e0: 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
f3f0: 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
f400: 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
f410: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
f420: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
f430: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
f440: 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
f450: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
f460: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
f470: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f480: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
f490: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f4a0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
f4b0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
f4c0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
f4d0: 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
f4e0: 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
f4f0: 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
f500: 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
f510: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
f520: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
f530: 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
f540: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
f550: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
f560: 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
f570: 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
f580: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
f590: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
f5a0: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
f5b0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
f5c0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48      if( pSub->pH
f5d0: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45  aving ){.      E
f5e0: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73  xpr *pHaving = s
f5f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
f600: 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  ub->pHaving);.  
f610: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
f620: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ng ){.        p-
f630: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
f640: 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  e3Expr(TK_AND, p
f650: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69  ->pHaving, pHavi
f660: 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ng, 0);.      }e
f670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
f680: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
f690: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
f6a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f6b0: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
f6c0: 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
f6d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f6e0: 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
f6f0: 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  By);.  }else if(
f700: 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b   p->pWhere==0 ){
f710: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
f720: 20 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65   pWhere;.  }else
f730: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
f740: 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
f750: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
f760: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72  );.    if( pWher
f770: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57  e ){.      p->pW
f780: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
f790: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57  pr(TK_AND, p->pW
f7a0: 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29  here, pWhere, 0)
f7b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f7c0: 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
f7d0: 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
f7e0: 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
f7f0: 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a  inner or the.  *
f800: 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
f810: 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f   distinct. .  */
f820: 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  .  p->isDistinct
f830: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
f840: 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74   || pSub->isDist
f850: 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  inct;..  /* Tran
f860: 73 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65  sfer the limit e
f870: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
f880: 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74  he subquery to t
f890: 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75  he outer.  ** qu
f8a0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ery..  */.  if( 
f8b0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  pSub->nLimit>=0 
f8c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  ){.    if( p->nL
f8d0: 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
f8e0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62  p->nLimit = pSub
f8f0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65  ->nLimit;.    }e
f900: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  lse if( p->nLimi
f910: 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70  t+p->nOffset > p
f920: 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62  Sub->nLimit+pSub
f930: 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->nOffset ){.   
f940: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
f950: 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53  Sub->nLimit + pS
f960: 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d  ub->nOffset - p-
f970: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  >nOffset;.    }.
f980: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74    }.  p->nOffset
f990: 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65   += pSub->nOffse
f9a0: 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c  t;..  /* Finiall
f9b0: 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
f9c0: 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
f9d0: 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
f9e0: 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
f9f0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
fa00: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
fa10: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
fa20: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
fa30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fa40: 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
fa50: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
fa60: 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
fa70: 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
fa80: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
fa90: 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
faa0: 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
fab0: 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
fac0: 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
fad0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
fae0: 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
faf0: 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
fb00: 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
fb10: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
fb20: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
fb30: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
fb40: 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
fb50: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
fb60: 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
fb70: 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
fb80: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
fb90: 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
fba0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
fbb0: 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
fbc0: 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
fbd0: 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
fbe0: 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
fbf0: 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
fc00: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
fc10: 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
fc20: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
fc30: 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
fc40: 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
fc50: 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
fc60: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
fc70: 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
fc80: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
fc90: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
fca0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
fcb0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
fcc0: 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
fcd0: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
fce0: 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
fcf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
fd00: 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
fd10: 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
fd20: 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
fd30: 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
fd40: 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
fd50: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
fd60: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
fd70: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
fd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
fd90: 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
fda0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fdb0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
fdc0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
fdd0: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
fde0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
fdf0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
fe00: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
fe10: 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
fe20: 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
fe30: 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
fe40: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
fe50: 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
fe60: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
fe70: 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
fe80: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
fe90: 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ;.  ..  /* Check
fea0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
feb0: 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
fec0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
fed0: 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
fee0: 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
fef0: 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
ff00: 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
ff10: 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
ff20: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
ff30: 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
ff40: 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
ff50: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
ff60: 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
ff70: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ff80: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
ff90: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ffa0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
ffb0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
ffc0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
ffd0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
ffe0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
fff0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
10000 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
10010 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
10020 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
10030 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
10040 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
10050 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
10060 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78  ite3StrNICmp(pEx
10070 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
10080 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
10090 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
100a0 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
100b0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
100c0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
100d0 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
100e0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
100f0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
10100 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10110 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
10120 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
10130 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
10140 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10150 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
10160 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
10170 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
10180 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
10190 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
101a0 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
101b0 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
101c0 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
101d0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
101e0 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
101f0 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
10200 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
10210 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
10220 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
10230 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
10240 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
10250 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
10260 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
10270 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
10280 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
10290 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
102a0 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
102b0 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
102c0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
102d0 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
102e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
102f0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
10300 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10310 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
10320 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
10330 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
10340 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
10350 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
10360 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
10370 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
10380 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
10390 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64  [0]==iCol && pId
103a0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
103b0 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65  [0]==pColl ) bre
103c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
103d0 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
103e0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
103f0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
10400 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
10410 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
10420 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
10430 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
10440 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
10450 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
10460 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
10470 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
10480 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
10490 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
104a0 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
104b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
104c0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
104d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
104e0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
104f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
10500 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
10510 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
10520 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
10530 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
10540 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
10550 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
10560 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
10570 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10580 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
10590 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
105a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
105b0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
105c0 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
105d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
105e0 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
105f0 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
10600 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
10610 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
10620 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
10630 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
10640 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
10650 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
10660 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
10670 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
10680 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
10690 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
106a0 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
106b0 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
106c0 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
106d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
106e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
106f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
10700 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
10710 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
10720 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
10730 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10740 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
10750 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
10760 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10780 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
10790 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
107a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
107b0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
107c0 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  e, pTab->tnum);.
107d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
107e0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
107f0 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20  mColumns, base, 
10800 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d  pTab->nCol);.  }
10810 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
10820 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10830 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
10840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10850 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
10860 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
10870 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10880 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10890 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
108a0 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
108b0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
108c0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
108d0 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  e+1, pIdx->tnum,
108e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
108f0 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78      (char*)&pIdx
10900 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
10910 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
10920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10930 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20  seekOp, base+1, 
10940 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
10950 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10960 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c  dxRecno, base+1,
10970 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10980 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10990 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
109a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
109b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
109c0 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
109d0 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
109e0 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
109f0 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
10a00 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
10a10 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
10a20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
10a30 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
10a40 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
10a50 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
10a60 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
10a70 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
10a80 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
10a90 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
10aa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10ab0 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
10ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10ad0 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
10ae0 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
10af0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   1;.}../*.** Gen
10b00 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
10b10 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
10b20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
10b30 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
10b40 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
10b50 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
10b60 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
10b70 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
10b80 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
10b90 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
10ba0 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
10bb0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
10bc0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bf0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
10c00 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
10c10 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
10c20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
10c30 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
10c40 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
10c50 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
10c60 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
10c70 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
10c80 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
10c90 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
10ca0 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
10cb0 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
10cc0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
10cd0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
10ce0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
10cf0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
10d00 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
10d10 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
10d20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
10d30 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
10d40 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
10d50 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
10d60 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
10d70 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
10d80 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
10d90 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10da0 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
10db0 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
10dc0 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
10dd0 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
10de0 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
10df0 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
10e00 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
10e10 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
10e20 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
10e30 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
10e40 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
10e50 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
10e60 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
10e70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10e80 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
10e90 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
10ea0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
10eb0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
10ec0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
10ed0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
10ee0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
10ef0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
10f00 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
10f10 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
10f20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
10f30 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
10f40 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
10f50 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
10f60 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
10f70 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
10f80 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
10f90 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
10fa0 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
10fb0 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
10fc0 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
10fd0 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
10fe0 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
10ff0 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
11000 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
11010 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
11020 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
11030 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
11040 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
11050 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
11060 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
11070 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
11080 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
11090 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
110a0 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
110b0 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
110c0 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
110d0 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
110e0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
110f0 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
11100 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
11110 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
11120 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
11130 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
11140 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
11150 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
11160 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
11190 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
111a0 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
111f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11200 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
11210 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
11220 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
11230 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11240 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
11250 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
11260 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
11270 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
11280 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
11290 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
112a0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
112b0 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
112c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
112d0 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
112e0 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
112f0 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
11300 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
11310 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
11320 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
11330 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
11340 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
11350 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
11360 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
11370 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
11380 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
11390 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
113a0 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
113b0 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
113c0 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
113d0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
113e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
113f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
11400 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11410 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11420 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
11430 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
11440 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
11450 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
11460 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
11470 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
11480 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
11490 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
114a0 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
114b0 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
114c0 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
114d0 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
114e0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
114f0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
11500 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
11510 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
11520 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
11530 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
11540 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
11550 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
11560 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
11570 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
11580 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
11590 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
115a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
115b0 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
115c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
115d0 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
115e0 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
115f0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
11600 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
11610 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
11620 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
11630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
11640 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
11650 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
11660 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
11670 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
11680 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
11690 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
116a0 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
116b0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
116c0 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
116d0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
116e0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
116f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
11700 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
11710 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
11720 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11730 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
11740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
11750 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
11760 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
11770 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
11780 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11790 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
117a0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
117b0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
117c0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
117d0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
117e0 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
117f0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
11800 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
11810 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
11820 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
11830 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
11840 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
11850 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
11860 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
11870 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
11880 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
11890 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
118a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  unction */..  if
118b0 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
118c0 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  _failed || pPars
118d0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20  e->nErr || p==0 
118e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
118f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11900 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11910 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
11920 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  0) ) return 1;..
11930 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
11940 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
11950 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
11960 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
11970 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
11980 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
11990 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
119a0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
119b0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
119c0 66 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ff);.  }..  /* M
119d0 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
119e0 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
119f0 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
11a00 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
11a10 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
11a20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
11a30 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  re;.  pOrderBy =
11a40 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11a50 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
11a60 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
11a70 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
11a80 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
11a90 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
11aa0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44 42   /* Allocate VDB
11ab0 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20 65 61  E cursors for ea
11ac0 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
11ad0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
11ae0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
11af0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
11b00 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
11b10 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
11b20 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
11b30 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
11b40 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
11b50 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
11b60 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
11b70 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
11b80 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
11b90 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
11ba0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
11bb0 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64  nd;..  /* Expand
11bc0 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69   any "*" terms i
11bd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
11be0 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20  .  (For example 
11bf0 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20  the "*" in.  ** 
11c00 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
11c10 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43  1")  The fillInC
11c20 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74  olumnlist() rout
11c30 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f  ine also does so
11c40 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f  me.  ** other ho
11c50 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65  usekeeping - see
11c60 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
11c70 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ent for details.
11c80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c  .  */.  if( fill
11c90 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
11ca0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
11cb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11cc0 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70    }.  pWhere = p
11cd0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69  ->pWhere;.  pELi
11ce0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11cf0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
11d00 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
11d10 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
11d20 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
11d30 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
11d40 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
11d50 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
11d60 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
11d70 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52    if( (eDest==SR
11d80 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
11d90 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69  SRT_Set) && pELi
11da0 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20  st->nExpr>1 ){. 
11db0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11dc0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
11dd0 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
11de0 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
11df0 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
11e00 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
11e10 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
11e20 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
11e30 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
11e40 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
11e50 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
11e60 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
11e70 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
11e80 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
11e90 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
11ea0 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
11eb0 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
11ec0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
11ed0 65 74 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72  et:.      pOrder
11ee0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  By = 0;.      br
11ef0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
11f00 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
11f10 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
11f20 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c   point, we shoul
11f30 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
11f40 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73   all the cursors
11f50 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65   that we.  ** ne
11f60 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62  ed to handle sub
11f70 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f  querys and tempo
11f80 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20  rary tables.  . 
11f90 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65   **.  ** Resolve
11fa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
11fb0 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e  s and do a seman
11fc0 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c  tics check on al
11fd0 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
11fe0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
11ff0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
12000 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
12010 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
12020 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
12030 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c  pTabList, 0, pEL
12040 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
12050 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
12060 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
12070 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12080 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
12090 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
120a0 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29  Expr, 1, &isAgg)
120b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
120c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
120d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
120e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  e ){.    if( sql
120f0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
12100 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
12110 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68  ist, pEList, pWh
12120 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ere) ){.      go
12130 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12150 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
12160 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
12170 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
12180 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12190 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48    }.  }.  if( pH
121a0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28  aving ){.    if(
121b0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
121c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
121d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
121e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
121f0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
12200 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
12210 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12220 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
12230 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
12240 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
12250 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
12260 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  t, pHaving) ){. 
12270 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
12280 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
12290 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
122a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61  heck(pParse, pHa
122b0 76 69 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29  ving, 1, &isAgg)
122c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
122d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
122e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65  .  }.  if( pOrde
122f0 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rBy ){.    for(i
12300 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
12310 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12320 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
12330 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
12340 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
12350 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
12360 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12370 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26  er(pE, &iCol) &&
12380 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
12390 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
123a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
123b0 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
123c0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
123d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
123e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
123f0 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
12400 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
12410 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12420 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
12430 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
12440 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
12450 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pE) ){.        g
12460 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12480 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
12490 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
124a0 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
124b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
124c0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
124d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
124e0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
124f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12500 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
12510 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
12520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12530 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12540 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12550 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74       "ORDER BY t
12560 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65  erms must not be
12570 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e   non-integer con
12580 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  stants");.      
12590 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
125a0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  end;.        }el
125b0 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c  se if( iCol<=0 |
125c0 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
125d0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
125e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
125f0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
12600 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
12610 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
12620 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
12630 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
12640 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
12650 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
12660 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
12670 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  pr);.          g
12680 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
126a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
126b0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
126c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
126d0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
126e0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
126f0 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
12700 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  pE = pGroupBy->a
12710 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12720 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12730 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
12740 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26  Col) && iCol>0 &
12750 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
12760 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
12770 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12780 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
12790 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  pE = pGroupBy->a
127a0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
127b0 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
127c0 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
127d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
127e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
127f0 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
12800 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
12810 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
12820 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12830 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
12840 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12850 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
12860 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
12870 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12880 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12890 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
128a0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
128b0 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
128c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
128d0 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
128e0 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  &iCol)==0 ){.   
128f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12900 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
12910 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55             "GROU
12920 50 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  P BY terms must 
12930 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
12940 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a  er constants");.
12950 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
12960 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
12970 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f     }else if( iCo
12980 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
12990 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
129a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
129b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52               "GR
129d0 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  OUP BY column nu
129e0 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
129f0 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
12a00 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
12a10 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
12a20 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  d", iCol, pEList
12a30 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
12a40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12a50 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
12a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12a70 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
12a80 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
12a90 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
12aa0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12ab0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
12ac0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
12ad0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
12ae0 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
12af0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
12b00 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
12b10 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
12b20 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
12b30 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
12b40 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
12b50 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
12b60 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12b70 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
12b80 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
12b90 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
12ba0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
12bb0 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 31 20  st);.  }..#if 1 
12bc0 20 2f 2a 20 49 20 64 6f 20 6e 6f 74 20 74 68 69   /* I do not thi
12bd0 6e 6b 20 77 65 20 6e 65 65 64 20 74 68 65 20 66  nk we need the f
12be0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 6e  ollowing code an
12bf0 79 20 6d 6f 72 65 2e 2e 2e 2e 20 2a 2f 0a 20 20  y more.... */.  
12c00 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
12c10 61 74 69 6f 6e 20 69 73 20 53 52 54 5f 55 6e 69  ation is SRT_Uni
12c20 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  on, then set the
12c30 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
12c40 6e 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 72  ns in.  ** the r
12c50 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c  ecords that will
12c60 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
12c70 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
12c80 74 61 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c 65  table. The calle
12c90 72 0a 20 20 2a 2a 20 63 6f 75 6c 64 6e 27 74 20  r.  ** couldn't 
12ca0 64 6f 20 74 68 69 73 2c 20 69 6e 20 63 61 73 65  do this, in case
12cb0 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
12cc0 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
12cd0 66 6f 72 6d 20 0a 20 20 2a 2a 20 22 53 45 4c 45  form .  ** "SELE
12ce0 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 2e 22 2e  CT * FROM ....".
12cf0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6e   .  **.  ** We n
12d00 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
12d10 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 20 69  efore we start i
12d20 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73  nserting records
12d30 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
12d40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12d50 28 77 68 69 63 68 20 68 61 73 20 68 61 64 20 4f  (which has had O
12d60 50 5f 4b 65 79 41 73 44 61 74 61 20 65 78 65 63  P_KeyAsData exec
12d70 75 74 65 64 20 6f 6e 20 69 74 29 2c 20 62 65 63  uted on it), bec
12d80 61 75 73 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  ause.  ** it is 
12d90 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
12da0 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  key comparison f
12db0 75 6e 63 74 69 6f 6e 2e 20 53 6f 20 64 6f 20 69  unction. So do i
12dc0 74 20 6e 6f 77 2c 20 65 76 65 6e 0a 20 20 2a 2a  t now, even.  **
12dd0 20 74 68 6f 75 67 68 20 74 68 69 73 20 6d 65 61   though this mea
12de0 6e 73 20 74 68 61 74 20 4f 50 5f 53 65 74 4e 75  ns that OP_SetNu
12df0 6d 43 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20  mColumns may be 
12e00 65 78 65 63 75 74 65 64 20 6f 6e 20 74 68 65 20  executed on the 
12e10 73 61 6d 65 0a 20 20 2a 2a 20 63 75 72 73 6f 72  same.  ** cursor
12e20 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e   more than once.
12e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12e40 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a  t==SRT_Union ){.
12e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e60 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
12e70 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
12e80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
12e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
12ea0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12eb0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
12ec0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
12ed0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  clause.  */.  fo
12ee0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
12ef0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
12f00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12f10 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
12f20 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65   = 0;.    int ne
12f30 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12f40 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ;..    if( pTabL
12f50 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
12f60 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
12f70 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
12f80 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30  t->a[i].zName!=0
12f90 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
12fa0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
12fb0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
12fc0 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
12fd0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
12fe0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12ff0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65  zName;.      nee
13000 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
13010 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
13020 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
13030 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  eContext = 0;.  
13040 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
13050 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
13060 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
13070 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61  lect, SRT_TempTa
13080 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ble, .          
13090 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
130a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70  >a[i].iCursor, p
130b0 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
130c0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
130d0 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
130e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
130f0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
13100 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
13110 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
13120 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
13130 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
13140 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ere;.    if( eDe
13150 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26  st!=SRT_Union &&
13160 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65   eDest!=SRT_Exce
13170 70 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  pt && eDest!=SRT
13180 5f 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20  _Discard ){.    
13190 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
131a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
131b0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
131c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
131d0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
131e0 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74  ving;.    isDist
131f0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
13200 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  inct;.  }..  /* 
13210 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
13220 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
13230 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
13240 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
13250 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
13260 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
13270 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
13280 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
13290 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
132a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
132b0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
132c0 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
132d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
132e0 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
132f0 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
13300 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
13310 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
13320 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
13330 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
13340 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
13350 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
13360 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
13370 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
13380 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
13390 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
133a0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
133b0 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
133c0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
133d0 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
133e0 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
133f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
13400 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
13410 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
13420 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79  use, resolve any
13430 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13440 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20  nces.  ** names 
13450 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 65  that have been e
13460 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
13470 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ied..  */.  if( 
13480 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
13490 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
134a0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
134b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
134c0 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  erBy->a[i].zName
134d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   ){.        pOrd
134e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
134f0 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20  ->pColl = .     
13500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
13510 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
13520 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
13530 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  i].zName, -1);. 
13540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13550 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13560 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r ){.      goto 
13570 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13580 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
13590 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
135a0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
135b0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
135c0 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  , p);..  /* If t
135d0 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
135e0 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
135f0 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
13600 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
13610 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
13620 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
13630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13640 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
13650 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b  Temp, iParm, 0);
13660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13670 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
13680 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d  umColumns, iParm
13690 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
136a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  ;.  }..  /* Do a
136b0 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67  n analysis of ag
136c0 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
136d0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ons..  */.  sqli
136e0 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
136f0 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20  eset(pParse);.  
13700 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  if( isAgg || pGr
13710 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73  oupBy ){.    ass
13720 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67  ert( pParse->nAg
13730 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67  g==0 );.    isAg
13740 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  g = 1;.    for(i
13750 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
13760 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13770 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13780 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
13790 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
137a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
137b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
137c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
137d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
137e0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
137f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
13800 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
13810 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
13820 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
13830 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
13840 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
13850 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
13860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
13870 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
13880 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13890 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
138a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41   && sqlite3ExprA
138b0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
138c0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
138d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
138e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
138f0 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
13900 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
13910 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
13920 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13930 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13940 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
13950 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
13960 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
13970 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13980 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13990 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
139a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
139b0 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61    /* Reset the a
139c0 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20  ggregator.  */. 
139d0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
139e0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
139f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13a00 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c   OP_AggReset, 0,
13a10 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a   pParse->nAgg);.
13a20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13a30 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
13a40 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
13a50 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69   *pFunc;.      i
13a60 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72  f( (pFunc = pPar
13a70 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
13a80 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e  c)!=0 && pFunc->
13a90 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
13aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13ab0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
13ac0 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61  Init, 0, i, (cha
13ad0 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e  r*)pFunc, P3_FUN
13ae0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
13af0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
13b00 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
13b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13b20 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
13b30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
13b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13b50 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
13b60 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
13b70 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
13b80 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
13b90 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   + pGroupBy->nEx
13ba0 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  pr*sizeof(CollSe
13bb0 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  q*);.      KeyIn
13bc0 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49  fo *pKey = (KeyI
13bd0 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  nfo *)sqliteMall
13be0 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  oc(sz);.      if
13bf0 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20  ( 0==pKey ){.   
13c00 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13c10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
13c20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20      pKey->enc = 
13c30 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
13c40 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69  .      pKey->nFi
13c50 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  eld = pGroupBy->
13c60 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f 72  nExpr;.      for
13c70 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
13c80 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13c90 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f         pKey->aCo
13ca0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[i] = sqlite3E
13cb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13cc0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
13cd0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
13ce0 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f    if( !pKey->aCo
13cf0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
13d00 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
13d10 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ] = pParse->db->
13d20 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13d30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
13d50 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
13d60 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33  (char *)pKey, P3
13d70 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
13d80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13d90 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
13da0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  e memory cell to
13db0 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
13dc0 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
13dd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13de0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
13df0 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
13e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e10 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
13e20 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
13e30 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74  }..  /* Open a t
13e40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
13e50 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
13e60 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
13e70 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
13e80 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  t ){.    distinc
13e90 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
13ea0 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70  ++;.    openTemp
13eb0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
13ec0 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20   distinct, 0);. 
13ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
13ee0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
13ef0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
13f00 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
13f10 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
13f20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
13f30 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
13f40 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20   pWhere, 0, .   
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42           pGroupB
13f70 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42  y ? 0 : &pOrderB
13f80 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  y);.  if( pWInfo
13f90 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
13fa0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65  t_end;..  /* Use
13fb0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
13fc0 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61  ner loop if we a
13fd0 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77  re not dealing w
13fe0 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61  ith.  ** aggrega
13ff0 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  tes.  */.  if( !
14000 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28  isAgg ){.    if(
14010 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
14020 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
14030 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
14040 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
14050 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
14060 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20           iParm, 
14070 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
14080 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
14090 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20  k, aff) ){.     
140a0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
140b0 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
140c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61  /* If we are dea
140d0 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67  ling with aggreg
140e0 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68  ates, then do th
140f0 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67  e special aggreg
14100 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  ate.  ** process
14110 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c  ing.  .  */.  el
14120 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20  se{.    AggExpr 
14130 2a 70 41 67 67 3b 0a 20 20 20 20 69 66 28 20 70  *pAgg;.    if( p
14140 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
14150 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20   int lbl1;.     
14160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
14170 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
14180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14190 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
141a0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
141b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
141c0 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66  }.      /* No af
141d0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73  finity string is
141e0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
141f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61   following OP_Ma
14200 6b 65 52 65 63 6f 72 64 20 0a 20 20 20 20 20 20  keRecord .      
14210 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 64 6f  ** because we do
14220 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20   not need to do 
14230 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20  any coercion of 
14240 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20  datatypes. */.  
14250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14260 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
14270 65 63 6f 72 64 2c 20 70 47 72 6f 75 70 42 79 2d  ecord, pGroupBy-
14280 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
14290 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
142a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
142b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
142c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
142d0 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31  ggFocus, 0, lbl1
142e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
142f0 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61  , pAgg=pParse->a
14300 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  Agg; i<pParse->n
14310 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b  Agg; i++, pAgg++
14320 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
14330 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e  Agg->isAgg ) con
14340 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73  tinue;.        s
14350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14360 50 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78  Parse, pAgg->pEx
14370 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
14380 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14390 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
143a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
143b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
143c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
143d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
143e0 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73  (i=0, pAgg=pPars
143f0 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73  e->aAgg; i<pPars
14400 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41  e->nAgg; i++, pA
14410 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  gg++){.      Exp
14420 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
14430 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75   nExpr;.      Fu
14440 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
14450 20 20 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73     if( !pAgg->is
14460 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
14470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
14480 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a  gg->pFunc!=0 );.
14490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
144a0 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70  gg->pFunc->xStep
144b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65  !=0 );.      pDe
144c0 66 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b  f = pAgg->pFunc;
144d0 0a 20 20 20 20 20 20 70 45 20 3d 20 70 41 67 67  .      pE = pAgg
144e0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
144f0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
14500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14510 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
14520 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e  CTION );.      n
14530 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
14540 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
14550 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
14560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14570 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14580 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
14590 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
145a0 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
145b0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
145c0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
145d0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
145e0 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70 43 6f 6c    for(j=0; !pCol
145f0 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b  l && j<nExpr; j+
14600 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  +){.          pC
14610 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
14620 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
14630 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d   pE->pList->a[j]
14640 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
14650 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
14660 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
14670 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
14680 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  tColl;.        s
14690 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
146a0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
146b0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
146c0 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
146d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
146e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
146f0 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45  P_AggFunc, 0, nE
14700 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66  xpr, (char*)pDef
14710 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
14720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45     }.  }..  /* E
14730 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
14740 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a  scan loop..  */.
14750 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
14760 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
14770 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65   If we are proce
14780 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73  ssing aggregates
14790 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74  , we need to set
147a0 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f   up a second loo
147b0 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20  p.  ** over all 
147c0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
147d0 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63   values and proc
147e0 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ess them..  */. 
147f0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
14800 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73    int endagg = s
14810 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14820 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
14830 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74  startagg;.    st
14840 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 33  artagg = sqlite3
14850 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14860 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61  AggNext, 0, enda
14870 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  gg);.    pParse-
14880 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20  >useAgg = 1;.   
14890 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
148a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
148b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
148c0 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61   pHaving, starta
148d0 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  gg, 1);.    }.  
148e0 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
148f0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
14900 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
14910 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
14920 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20  t, eDest,.      
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
14940 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65  arm, startagg, e
14950 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20  ndagg, aff) ){. 
14960 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
14970 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
14980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14990 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
149a0 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73  startagg);.    s
149b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
149c0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67  eLabel(v, endagg
149d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
149e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
149f0 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  op, 0, 0);.    p
14a00 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
14a10 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
14a20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
14a30 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
14a40 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
14a50 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
14a60 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
14a70 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
14a80 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
14a90 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
14aa0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
14ab0 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
14ac0 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
14ad0 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
14ae0 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rm);.  }..  /* I
14af0 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
14b00 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
14b10 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
14b20 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
14b30 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
14b40 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74  table.  So delet
14b50 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73  e the subquery s
14b60 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
14b70 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f  e parent.  ** to
14b80 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75   prevent this su
14b90 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
14ba0 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
14bb0 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
14bc0 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20  he.  ** the use 
14bd0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
14be0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
14bf0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
14c00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
14c10 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
14c20 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
14c30 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
14c40 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
14c50 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
14c60 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
14c70 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20  ctDelete(p);.   
14c80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
14c90 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
14ca0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lect = 0;.  }.. 
14cb0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
14cc0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
14cd0 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
14ce0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
14cf0 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
14d00 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
14d10 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
14d20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
14d30 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
14d40 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
14d50 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
14d60 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
14d70 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
14d80 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
14d90 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  lect_end:.  sqli
14da0 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
14db0 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20  eset(pParse);.  
14dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.