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

Artifact 62431fb1a1021301e35f12f64c325d5f20371393:


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 36 36  select.c,v 1.166
0200: 20 32 30 30 34 2f 30 35 2f 31 38 20 30 31 3a 32   2004/05/18 01:2
0210: 33 3a 33 38 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:38 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 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65   char *zSortOrde
24f0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 53  r;.  int i;.  zS
2500: 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  ortOrder = sqlit
2510: 65 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42  eMalloc( pOrderB
2520: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a  y->nExpr + 1 );.
2530: 20 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72    if( zSortOrder
2540: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2550: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
2560: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
2570: 7b 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 20  {.    int order 
2580: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
2590: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
25a0: 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 69 6e  int type;.    in
25b0: 74 20 63 3b 0a 20 20 20 20 69 66 28 20 28 6f 72  t c;.    if( (or
25c0: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
25d0: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
25e0: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
25f0: 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45     type = SQLITE
2600: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  _SO_TEXT;.    }e
2610: 6c 73 65 20 69 66 28 20 28 6f 72 64 65 72 20 26  lse if( (order &
2620: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d   SQLITE_SO_TYPEM
2630: 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ASK)==SQLITE_SO_
2640: 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 74 79 70  NUM ){.      typ
2650: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  e = SQLITE_SO_NU
2660: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2670: 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74      type = sqlit
2680: 65 33 45 78 70 72 54 79 70 65 28 70 4f 72 64 65  e3ExprType(pOrde
2690: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
26a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26b0: 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f  (order & SQLITE_
26c0: 53 4f 5f 44 49 52 4d 41 53 4b 29 3d 3d 53 51 4c  SO_DIRMASK)==SQL
26d0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
26e0: 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53 51      c = type==SQ
26f0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27  LITE_SO_TEXT ? '
2700: 41 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20 7d 65  A' : '+';.    }e
2710: 6c 73 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 74  lse{.      c = t
2720: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  ype==SQLITE_SO_T
2730: 45 58 54 20 3f 20 27 44 27 20 3a 20 27 2d 27 3b  EXT ? 'D' : '-';
2740: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74  .    }.    zSort
2750: 4f 72 64 65 72 5b 69 5d 20 3d 20 63 3b 0a 20 20  Order[i] = c;.  
2760: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2770: 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  e(pParse, pOrder
2780: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2790: 0a 20 20 7d 0a 20 20 7a 53 6f 72 74 4f 72 64 65  .  }.  zSortOrde
27a0: 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  r[pOrderBy->nExp
27b0: 72 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  r] = 0;.  sqlite
27c0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
27d0: 6f 72 74 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64  ortMakeKey, pOrd
27e0: 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30 2c 20  erBy->nExpr, 0, 
27f0: 7a 53 6f 72 74 4f 72 64 65 72 2c 20 50 33 5f 44  zSortOrder, P3_D
2800: 59 4e 41 4d 49 43 29 3b 0a 20 20 73 71 6c 69 74  YNAMIC);.  sqlit
2810: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2820: 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29  P_SortPut, 0, 0)
2830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2840: 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 50  routine adds a P
2850: 33 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  3 argument to th
2860: 65 20 6c 61 73 74 20 56 44 42 45 20 6f 70 63 6f  e last VDBE opco
2870: 64 65 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 69  de that was.** i
2880: 6e 73 65 72 74 65 64 2e 20 54 68 65 20 50 33 20  nserted. The P3 
2890: 61 72 67 75 6d 65 6e 74 20 61 64 64 65 64 20 69  argument added i
28a0: 73 20 61 20 73 74 72 69 6e 67 20 73 75 69 74 61  s a string suita
28b0: 62 6c 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ble for the .** 
28c0: 4f 50 5f 4d 61 6b 65 4b 65 79 20 6f 72 20 4f 50  OP_MakeKey or OP
28d0: 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f  _MakeIdxKey opco
28e0: 64 65 73 2e 20 20 54 68 65 20 73 74 72 69 6e 67  des.  The string
28f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20   consists of.** 
2900: 63 68 61 72 61 63 74 65 72 73 20 27 74 27 20 6f  characters 't' o
2910: 72 20 27 6e 27 20 64 65 70 65 6e 64 69 6e 67 20  r 'n' depending 
2920: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
2930: 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
2940: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
2950: 65 79 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ey to be generat
2960: 65 64 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65  ed should be tre
2970: 61 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a  ated as numeric.
2980: 2a 2a 20 6f 72 20 61 73 20 74 65 78 74 2e 20 20  ** or as text.  
2990: 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 4b  See the OP_MakeK
29a0: 65 79 20 61 6e 64 20 4f 50 5f 4d 61 6b 65 49 64  ey and OP_MakeId
29b0: 78 4b 65 79 20 6f 70 63 6f 64 65 0a 2a 2a 20 64  xKey opcode.** d
29c0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
29d0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
29e0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
29f0: 65 20 50 33 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  e P3 string..** 
2a00: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c  See also the sql
2a10: 69 74 65 33 41 64 64 49 64 78 4b 65 79 54 79 70  ite3AddIdxKeyTyp
2a20: 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  e() routine..*/.
2a30: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4b  void sqlite3AddK
2a40: 65 79 54 79 70 65 28 56 64 62 65 20 2a 76 2c 20  eyType(Vdbe *v, 
2a50: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2a60: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  ){.  int nColumn
2a70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
2a80: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
2a90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
2aa0: 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 69  nColumn+1 );.  i
2ab0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 54 79 70  nt i;.  if( zTyp
2ac0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
2ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
2ae0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  umn; i++){.    z
2af0: 54 79 70 65 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Type[i] = sqlite
2b00: 33 45 78 70 72 54 79 70 65 28 70 45 4c 69 73 74  3ExprType(pEList
2b10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53  ->a[i].pExpr)==S
2b20: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f 20 27  QLITE_SO_NUM ? '
2b30: 6e 27 20 3a 20 27 74 27 3b 0a 20 20 7d 0a 20 20  n' : 't';.  }.  
2b40: 7a 54 79 70 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zType[i] = 0;.  
2b50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b60: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
2b70: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 7d  , P3_DYNAMIC);.}
2b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2b90: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
2ba0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
2bb0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
2bc0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
2bd0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
2be0: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
2bf0: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
2c00: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
2c10: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
2c20: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
2c30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
2c40: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
2c50: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
2c60: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
2c70: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
2c80: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
2c90: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
2ca0: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
2cb0: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
2cc0: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
2cd0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e  tic int selectIn
2ce0: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
2cf0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2d00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2d10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2d20: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2d30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2d40: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
2d50: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2d60: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
2d70: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
2d80: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
2d90: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
2da0: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
2db0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
2dc0: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
2dd0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2de0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2e10: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
2e20: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2e30: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
2e40: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
2e50: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
2e60: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
2e70: 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20  int distinct,   
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d          /* If >=
2e90: 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73  0, make sure res
2ea0: 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63  ults are distinc
2eb0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ed0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
2ee0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f10: 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  An argument to t
2f20: 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  he disposal meth
2f30: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  od */.  int iCon
2f40: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
2f50: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2f60: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
2f70: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
2f80: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
2f90: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2fa0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
2fb0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
2fc0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
2fd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2fe0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2ff0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
3000: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
3010: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
3020: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
3030: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
3040: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3050: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
3060: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
3070: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
3080: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
3090: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
30a0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  rBy==0 ){.    if
30b0: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
30c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
30d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
30e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
30f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3100: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
3110: 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  ncr, p->iOffset,
3120: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
3130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3140: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3150: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
3160: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69  }.    if( p->iLi
3170: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit>=0 ){.      
3180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3190: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
31a0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
31b0: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  k);.    }.  }.. 
31c0: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
31d0: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
31e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75    */.  if( nColu
31f0: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
3200: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
3210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
3220: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3230: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
3240: 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  b, i);.    }.  }
3250: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  else{.    nColum
3260: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
3270: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
3280: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
3290: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
32a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
32b0: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
32c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
32d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32e0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
32f0: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
3300: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3310: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
3320: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
3330: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
3340: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
3350: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
3360: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
3370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
3380: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3390: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
33a0: 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  pr>0 ){.#if NULL
33b0: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
33c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
33d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
33e0: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
33f0: 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  pr, sqlite3VdbeC
3400: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29  urrentAddr(v)+7)
3410: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
3420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3430: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
3440: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
3450: 20 20 20 20 73 71 6c 69 74 65 33 41 64 64 4b 65      sqlite3AddKe
3460: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
3470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3480: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73  eAddOp(v, OP_Dis
3490: 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c  tinct, distinct,
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
34b0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
34c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70  dOp(v, OP_Pop, p
34e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20  EList->nExpr+1, 
34f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
3500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3510: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
3520: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
3530: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3540: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3560: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3570: 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29  ey, distinct, 0)
3580: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
3590: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
35a0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
35b0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
35c0: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
35d0: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
35e0: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
35f0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
3600: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
3610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3620: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3630: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
3640: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
3650: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
3660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3670: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3680: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      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 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
36b0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
36c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
36d0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
36e0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
36f0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
3700: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
3710: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
3720: 20 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70     case SRT_Temp
3730: 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73  Table: {.      s
3740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3750: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3760: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3770: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
3780: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
3790: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
37a0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
37b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
37e0: 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30  wRecno, iParm, 0
37f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3800: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3810: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3840: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
3850: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
3860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3870: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
3880: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
3890: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
38a0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
38b0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
38c0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
38d0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
38e0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
38f0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
3900: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
3910: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
3920: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
3930: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3940: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
3950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3960: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3970: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
3980: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
39b0: 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c  NotFound, iParm,
39c0: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
39d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
39e0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
39f0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3a00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a10: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3a20: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3a30: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3a40: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3a50: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3a60: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3a70: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3a80: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3a90: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3aa0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3ab0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3ac0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3ad0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3ae0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3af0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3b00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3b10: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
3b20: 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  r2;..      asser
3b30: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
3b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3b50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3b60: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31  tNull, -1, addr1
3b70: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
3b80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3b90: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
3ba0: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
3bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3bc0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
3bd0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3be0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3bf0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
3c00: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
3c10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3c20: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
3c30: 73 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20  st *affStr;.    
3c40: 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 28      char aff = (
3c50: 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b  iParm>>16)&0xFF;
3c60: 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
3c70: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
3c80: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
3c90: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
3ca0: 20 20 20 20 20 20 20 20 61 66 66 53 74 72 20 3d          affStr =
3cb0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
3cc0: 53 74 72 69 6e 67 28 61 66 66 29 3b 0a 20 20 20  String(aff);.   
3cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ce0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  Op3(v, OP_MakeKe
3cf0: 79 2c 20 31 2c 20 31 2c 20 61 66 66 53 74 72 2c  y, 1, 1, affStr,
3d00: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3d10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3d20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
3d30: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
3d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3d50: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
3d60: 4b 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30  Key, (iParm&0x00
3d70: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
3d80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
3d90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
3da0: 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33  , addr2, sqlite3
3db0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3dc0: 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v));.      break
3dd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3de0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
3df0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
3e00: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
3e10: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
3e20: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
3e30: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
3e40: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
3e50: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
3e60: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
3e70: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
3e80: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3e90: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
3ea0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
3eb0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
3ec0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3ed0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3ee0: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3ef0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3f00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f20: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
3f30: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
3f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f50: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3f60: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
3f70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3f80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e     }..    /* Sen
3f90: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
3fa0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
3fb0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
3fc0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
3fd0: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
3fe0: 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Sorter: {.      
3ff0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4020: 6f 72 74 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c  ortMakeRec, nCol
4030: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  umn, 0);.       
4040: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4050: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
4060: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
4070: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4080: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  t( eDest==SRT_Ca
4090: 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
40a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
40b0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
40c0: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
40d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
40e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40f0: 2f 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72  /* Invoke a subr
4100: 6f 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65  outine to handle
4110: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
4120: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
4130: 73 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72  self.    ** is r
4140: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70  esponsible for p
4150: 6f 70 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c  opping the resul
4160: 74 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74  ts off of the st
4170: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
4180: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4190: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
41a0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
41b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
41c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
41d0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
41e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
41f0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4200: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
4210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4230: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4240: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
4250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4260: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4270: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
4280: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
4290: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
42a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
42b0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
42c0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
42d0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
42e0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
42f0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
4300: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
4310: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
4320: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
4330: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
4340: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
4350: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
4360: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
4370: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
4380: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4390: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
43a0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71  card );.      sq
43b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
43c0: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
43d0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
43e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
43f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4400: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
4410: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
4420: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
4430: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
4440: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
4450: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
4460: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
4470: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
4480: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
4490: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
44a0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
44b0: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
44c0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
44d0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
44e0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
44f0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
4500: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
4510: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
4520: 72 74 54 61 69 6c 28 0a 20 20 53 65 6c 65 63 74  rtTail(.  Select
4530: 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68   *p,       /* Th
4540: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4550: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
4560: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4570: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4580: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
4590: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t nColumn,     /
45a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
45b0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
45c0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
45d0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
45e0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
45f0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  re */.  int iPar
4600: 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69  m        /* Opti
4610: 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61  onal parameter a
4620: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
4630: 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Dest */.){.  int
4640: 20 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56   end1 = sqlite3V
4650: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4660: 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71  .  int end2 = sq
4670: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4680: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
4690: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
46a0: 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74  SRT_Sorter ) ret
46b0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
46c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
46d0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
46e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
46f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
4700: 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20  ext, 0, end1);. 
4710: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e   if( p->iOffset>
4720: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4730: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4740: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66  _MemIncr, p->iOf
4750: 66 73 65 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20  fset, addr+4);. 
4760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4770: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4780: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4790: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
47a0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
47b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c  .  }.  if( p->iL
47c0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  imit>=0 ){.    s
47d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
47e0: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
47f0: 2d 3e 69 4c 69 6d 69 74 2c 20 65 6e 64 32 29 3b  ->iLimit, end2);
4800: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
4810: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
4820: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
4830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4840: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4850: 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  rtCallback, nCol
4860: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  umn, 0);.      b
4870: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4880: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
4890: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d      case SRT_Tem
48a0: 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20  pTable: {.      
48b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
48c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
48d0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
48e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48f0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
4900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4910: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4920: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50  OP_PutIntKey, iP
4930: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4950: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4970: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4990: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
49a0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  , -1, sqlite3Vdb
49b0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
49c0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
49d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
49e0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a00: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4a10: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
4a20: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a40: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
4a50: 4b 65 79 2c 20 31 2c 20 31 2c 20 22 6e 22 2c 20  Key, 1, 1, "n", 
4a60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a80: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
4a90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
4aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4ab0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
4ac0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
4ad0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  F), 0);.      br
4ae0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4af0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4b00: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4b10: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b30: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
4b40: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
4b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b60: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4b70: 30 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20 20  0, end1);.      
4b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4b90: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4ba0: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
4bb0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
4bc0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
4bd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bf0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69   OP_Column, -1-i
4c00: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
4c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4c30: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c50: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4c60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4c70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4c80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
4c90: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
4ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4cb0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
4cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4cd0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
4ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
4cf0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 32  lveLabel(v, end2
4d00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4d10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4d20: 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
4d30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
4d40: 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71  l(v, end1);.  sq
4d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4d60: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4d70: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4d80: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4d90: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4da0: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4db0: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4dc0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4dd0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4de0: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4df0: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4e00: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4e10: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4e20: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4e30: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4e40: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4e50: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4e60: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4e70: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4e80: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4e90: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4ea0: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4eb0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4ec0: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4ed0: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4ee0: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4ef0: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4f00: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4f10: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4f20: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4f30: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4f40: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4f50: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
4f60: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4f70: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4f80: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
4f90: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
4fa0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4fb0: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
4fc0: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
4fd0: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
4fe0: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
4ff0: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
5000: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
5010: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
5020: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5030: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5040: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5050: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5060: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5070: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5080: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
5090: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
50a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
50b0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
50c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
50d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
50e0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
50f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5100: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
5110: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
5120: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
5130: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   0;.    if( p==0
5140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5150: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
5160: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5170: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5180: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e   *pTab;.      in
5190: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
51a0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
51b0: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
51c0: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
51d0: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
51e0: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
51f0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
5200: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
5210: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
5220: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
5230: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
5240: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
5250: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
5260: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5270: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5280: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5290: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
52a0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
52b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
52c0: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
52d0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
52e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
52f0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
5300: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5310: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
5320: 78 70 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49  xprType(p)==SQLI
5330: 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20  TE_SO_TEXT ){.  
5340: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54        zType = "T
5350: 45 58 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EXT";.      }els
5360: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5370: 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20   = "NUMERIC";.  
5380: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5390: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
53a0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
53b0: 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i + pEList->nEx
53c0: 70 72 2c 20 30 2c 20 7a 54 79 70 65 2c 20 30 29  pr, 0, zType, 0)
53d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
53e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
53f0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
5400: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
5410: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
5420: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
5430: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
5440: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
5450: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
5460: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
5470: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
5480: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
5490: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
54a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
54b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
54c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
54d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
54e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
54f0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
5500: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
5510: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
5520: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
5530: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
5540: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5550: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
5560: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
5570: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5580: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
5590: 74 4e 61 6d 65 73 3b 0a 0a 20 20 61 73 73 65 72  tNames;..  asser
55a0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
55b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
55c0: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
55d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
55e0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
55f0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
5600: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
5610: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
5620: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
5630: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
5640: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
5650: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5660: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
5670: 21 3d 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  !=0;.  for(i=0; 
5680: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5690: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
56a0: 2a 70 3b 0a 20 20 20 20 69 6e 74 20 70 32 20 3d  *p;.    int p2 =
56b0: 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
56c0: 72 2d 31 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c  r-1;.    p = pEL
56d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
56e0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
56f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5700: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5710: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5720: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5730: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5750: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  eOp3(v, OP_Colum
5760: 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a 4e  nName, i, p2, zN
5770: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ame, 0);.      c
5780: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5790: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
57a0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
57b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
57c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
57d0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
57e0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
57f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
5800: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
5810: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
5820: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
5830: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
5840: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
5850: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
5860: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
5870: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5880: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
5890: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
58a0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
58b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
58c0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
58d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
58e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
58f0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
5900: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
5910: 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 7d  ROWID_";.      }
5920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
5930: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
5940: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
5950: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
5960: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
5970: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
5980: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
5990: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
59a0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
59b0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 4f 50 5f  te3VdbeOp3(v,OP_
59c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70  ColumnName, i, p
59d0: 32 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  2, p->span.z, p-
59e0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
59f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d    sqlite3VdbeCom
5a00: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
5a10: 64 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  dr);.      }else
5a20: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
5a30: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
5a40: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
5a50: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
5a60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
5a70: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
5a80: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
5a90: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5aa0: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
5ab0: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
5ac0: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
5ad0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
5ae0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
5af0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
5b00: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
5b10: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
5b20: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5b30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
5b40: 2c 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20  , i, p2, zName, 
5b50: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
5b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
5b80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5b90: 65 2c 20 69 2c 20 70 32 2c 20 7a 43 6f 6c 2c 20  e, i, p2, zCol, 
5ba0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5bb0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
5bc0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5bd0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
5be0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
5bf0: 64 62 65 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75  dbeOp3(v,OP_Colu
5c00: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70  mnName, i, p2, p
5c10: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
5c20: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n.n);.      sqli
5c30: 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53  te3VdbeCompressS
5c40: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
5c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5c60: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
5c70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5c80: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
5c90: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
5ca0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
5cb0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
5cc0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
5cd0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5ce0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
5cf0: 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  , p2, zName, 0);
5d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5d10: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
5d20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
5d30: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
5d40: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
5d50: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5d60: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
5d70: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
5d80: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
5d90: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
5da0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
5db0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
5dc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5dd0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
5de0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
5df0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5e00: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
5e10: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
5e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
5e30: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
5e40: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
5e50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
5e60: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
5e70: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
5e80: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
5e90: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
5ea0: 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  List(Parse*, Sel
5eb0: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
5ec0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
5ed0: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
5ee0: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
5ef0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
5f00: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
5f10: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
5f20: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
5f30: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
5f40: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
5f50: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
5f60: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
5f70: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
5f80: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
5f90: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
5fa0: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
5fb0: 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69  *aCol;..  if( fi
5fc0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
5fd0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
5fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5ff0: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
6000: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6010: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
6020: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6040: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
6050: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
6060: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
6070: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
6080: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
6090: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
60a0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
60b0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
60c0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
60d0: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
60e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
60f0: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
6100: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
6110: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6120: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
6130: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
6140: 70 52 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  pR;.    if( pELi
6150: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6160: 7b 0a 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e  {.      aCol[i].
6170: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
6180: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
6190: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
61a0: 6c 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73  lse if( (p=pELis
61b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
61c0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
61d0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
61e0: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
61f0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
6200: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
6210: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   ){.      int cn
6220: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
6230: 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c  SetNString(&aCol
6240: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74  [i].zName, pR->t
6250: 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65  oken.z, pR->toke
6260: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  n.n, 0);.      f
6270: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
6280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
6290: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
62a0: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
62b0: 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d   aCol[i].zName)=
62c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
62d0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
62e0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
62f0: 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
6300: 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63  f(zBuf,"_%d",++c
6310: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  nt);.          n
6320: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
6330: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6340: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43  e3SetNString(&aC
6350: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d  ol[i].zName, pR-
6360: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f  >token.z, pR->to
6370: 6b 65 6e 2e 6e 2c 20 7a 42 75 66 2c 6e 2c 30 29  ken.n, zBuf,n,0)
6380: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20  ;.          j = 
6390: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
63a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
63b0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
63c0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
63d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
63e0: 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e  tNString(&pTab->
63f0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[i].zName, p
6400: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
6410: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  n.n, 0);.    }el
6420: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
6430: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
6440: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f  printf(zBuf, "co
6450: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
6460: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
6470: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
6480: 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a 20  eStrDup(zBuf);. 
6490: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
64a0: 20 41 66 66 69 6e 69 74 79 20 69 73 20 61 6c 77   Affinity is alw
64b0: 61 79 73 20 4e 4f 4e 45 2c 20 61 73 20 74 68 65  ays NONE, as the
64c0: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 6e 61  re is no type na
64d0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  me. */.    pTab-
64e0: 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74  >aCol[i].affinit
64f0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
6500: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  ONE;.  }.  pTab-
6510: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72  >iPKey = -1;.  r
6520: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
6530: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76  *.** For the giv
6540: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
6550: 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68  ent, do three th
6560: 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings..**.**    (
6570: 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  1)  Fill in the 
6580: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
6590: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
65a0: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
65b0: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
65c0: 73 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  s the set of tab
65d0: 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  les that should 
65e0: 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72  be scanned.  For
65f0: 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20   views,.**      
6600: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
6610: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
6620: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
6630: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6640: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
6650: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
6660: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
6670: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
6680: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
6690: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
66a0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
66b0: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
66c0: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
66d0: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
66e0: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
66f0: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
6700: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
6710: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
6720: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
6730: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
6740: 20 20 20 28 32 29 20 20 41 64 64 20 74 65 72 6d     (2)  Add term
6750: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
6760: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
6770: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
6780: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
6790: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
67a0: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
67b0: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
67c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
67d0: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
67e0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
67f0: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
6800: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
6810: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
6820: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
6830: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
6840: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
6850: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
6860: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
6870: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
6880: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
6890: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
68a0: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
68b0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
68c0: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
68d0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
68e0: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
68f0: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
6900: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
6910: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
6920: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
6930: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
6940: 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c  ic int fillInCol
6950: 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70  umnList(Parse *p
6960: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
6970: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
6980: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
6990: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
69a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
69b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20   Table *pTab;.. 
69c0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
69d0: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
69e0: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
69f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
6a00: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
6a10: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
6a20: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
6a30: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
6a40: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
6a50: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
6a60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
6a70: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
6a80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
6a90: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
6aa0: 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65  n before!  No ne
6ab0: 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a  ed to continue *
6ac0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
6ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6ae0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6af0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
6b00: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
6b10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
6b20: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
6b30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
6b40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6b50: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
6b60: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6b70: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20  >a[i].zAlias==0 
6b80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6b90: 7a 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20  zFakeName[60];. 
6ba0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
6bb0: 46 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74  FakeName, "sqlit
6bc0: 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
6bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
6be0: 64 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  d*)pTabList->a[i
6bf0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6c00: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
6c10: 72 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e  ring(&pTabList->
6c20: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61  a[i].zAlias, zFa
6c30: 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  keName, 0);.    
6c40: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69    }.      pTabLi
6c50: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
6c60: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
6c70: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
6c80: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
6c90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6ca0: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6ce0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
6cf0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6d00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6d20: 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74   The isTransient
6d30: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
6d40: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
6d50: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
6d60: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
6d70: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6d80: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
6d90: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
6da0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
6db0: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
6dc0: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
6dd0: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
6de0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
6df0: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
6e00: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6e10: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
6e20: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
6e30: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  nt = 1;.    }els
6e40: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
6e50: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
6e60: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
6e70: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6e80: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
6e90: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
6ea0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
6eb0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
6ec0: 70 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d  pParse,pTabList-
6ed0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62  >a[i].zName,pTab
6ee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
6ef0: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
6f00: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
6f10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6f30: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
6f40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
6f50: 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
6f60: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
6f70: 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
6f80: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
6f90: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
6fa0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
6fb0: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
6fc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6fe0: 2f 2a 20 49 66 20 70 54 61 62 4c 69 73 74 2d 3e  /* If pTabList->
6ff0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20  a[i].pSelect!=0 
7000: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
7010: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
7020: 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
7030: 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
7040: 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
7050: 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
7060: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
7070: 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
7080: 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
7090: 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
70a0: 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
70b0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
70c0: 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
70d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
70e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
70f0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
7100: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7110: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
7120: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7130: 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b  (pTab->pSelect);
7140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7150: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7160: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
7170: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
7180: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7190: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
71a0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
71b0: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
71c0: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
71d0: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
71e0: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
71f0: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
7200: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
7210: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
7220: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7230: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
7240: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
7250: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
7260: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
7270: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
7280: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
7290: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
72a0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
72b0: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
72c0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
72d0: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
72e0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
72f0: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
7300: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
7310: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
7320: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
7330: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
7340: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
7350: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
7360: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
7370: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
7380: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
7390: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
73a0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
73b0: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
73c0: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
73d0: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
73e0: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
73f0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
7400: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
7410: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
7420: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
7430: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
7440: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
7450: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
7460: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
7470: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
7480: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
7490: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
74a0: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
74b0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
74c0: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
74d0: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
74e0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
74f0: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
7500: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
7510: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
7520: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
7530: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
7540: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
7550: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
7560: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
7570: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7580: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
7590: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
75a0: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
75b0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
75c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
75d0: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
75e0: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
75f0: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
7600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
7610: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
7620: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
7630: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
7640: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
7650: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
7660: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
7670: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
7680: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
7690: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
76a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
76b0: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
76c0: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
76d0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
76e0: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
76f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
7700: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7710: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61  stAppend(pNew, a
7720: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
7730: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
7740: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
7750: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
7760: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  ;.        a[k].p
7770: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
7780: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
7790: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
77a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
77b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
77c0: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
77d0: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
77e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
77f0: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
7800: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
7810: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
7820: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
7830: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
7840: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65      Token *pName
7850: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  ;           /* t
7860: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
7870: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
7880: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
7890: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
78a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  ){.          pNa
78b0: 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d  me = &pE->pLeft-
78c0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
78d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
78e0: 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   pName = 0;.    
78f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
7900: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
7910: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
7920: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
7930: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7940: 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[i].pTab;.    
7950: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7960: 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Name = pTabList-
7970: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[i].zAlias;.  
7980: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7990: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
79a0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
79b0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
79c0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
79d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
79f0: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
7a00: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
7a10: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
7a20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7a30: 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e  StrNICmp(pName->
7a40: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61  z, zTabName, pNa
7a50: 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20  me->n)!=0 ||.   
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
7a70: 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d  abName[pName->n]
7a80: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7a90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ab0: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7ac0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7ad0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7ae0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7af0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7b00: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7b10: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7b20: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7b30: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7b40: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7b50: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7b60: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7b70: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7b80: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7b90: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7ba0: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7bb0: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7bc0: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7bd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7be0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7bf0: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7c00: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7c20: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7c30: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7c40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7c50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7c60: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7c70: 26 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  & sqlite3IdListI
7c80: 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61  ndex(pTabList->a
7c90: 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  [i-1].pUsing, zN
7ca0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
7cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
7cc0: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
7cd0: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
7ce0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7d00: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
7d10: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
7d20: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
7d30: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
7d40: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
7d50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
7d60: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
7d70: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
7d90: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7da0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7db0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
7dc0: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
7dd0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
7de0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
7df0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
7e00: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
7e10: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
7e20: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
7e30: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
7e40: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
7e50: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7e60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
7e70: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7e90: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7ea0: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
7eb0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
7ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7ed0: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7ef0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Left->token.z = 
7f00: 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zTabName;.      
7f10: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
7f20: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
7f30: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
7f40: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
7f50: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7f70: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 28 63  ite3SetString((c
7f80: 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70  har**)&pExpr->sp
7f90: 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  an.z, zTabName, 
7fa0: 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ".", zName, 0);.
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7fc0: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74  xpr->span.n = st
7fd0: 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e  rlen(pExpr->span
7fe0: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .z);.           
7ff0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
8000: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
8010: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8020: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
8030: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8040: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
8050: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8060: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
8070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
8080: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
8090: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
80a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
80b0: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
80c0: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
80d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
80e0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
80f0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8100: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8130: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
8140: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8150: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
8160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8170: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8180: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54  o such table: %T
8190: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
81a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
81b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
81c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
81d0: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
81e0: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
81f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
8200: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8220: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8230: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
8240: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
8250: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74   pNew;.  }.  ret
8260: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8270: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8280: 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b  cursively unlink
8290: 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  s the Select.pSr
82a0: 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74  c.a[].pTab point
82b0: 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65  ers.** in a sele
82c0: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ct structure.  I
82d0: 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  t just sets the 
82e0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c  pointers to NULL
82f0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
8300: 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ne is recursive 
8310: 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
8320: 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e  t if the Select.
8330: 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74  pSrc.a[].pSelect
8340: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  .** pointer is n
8350: 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f  ot NULL, this ro
8360: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8370: 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
8380: 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  hat pointer..**.
8390: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
83a0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
83b0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
83c0: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
83d0: 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65  .** VIEW in orde
83e0: 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69  r to undo any bi
83f0: 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73  ndings to tables
8400: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
8410: 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  sary.** because 
8420: 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67  those tables mig
8430: 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20  ht be DROPed by 
8440: 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c  a subsequent SQL
8450: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20   command..** If 
8460: 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65  the bindings are
8470: 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68   not removed, th
8480: 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  en the Select.pS
8490: 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  rc->a[].pTab fie
84a0: 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65  ld.** will be le
84b0: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ft pointing to a
84c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62   deallocated Tab
84d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74  le structure aft
84e0: 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61  er the.** DROP a
84f0: 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69  nd a coredump wi
8500: 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78  ll occur the nex
8510: 74 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20  t time the VIEW 
8520: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
8530: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
8540: 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b  bind(Select *p){
8550: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
8560: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
8570: 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Src;.  Table *pT
8580: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
8590: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
85a0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
85b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
85c0: 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b  (pTab = pSrc->a[
85d0: 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20  i].pTab)!=0 ){. 
85e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69       if( pTab->i
85f0: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
8600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
8610: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
8620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8630: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
8640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8650: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
8660: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
8670: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
8680: 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  d(pSrc->a[i].pSe
8690: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
86a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
86b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
86c0: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
86d0: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
86e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
86f0: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
8700: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
8710: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
8720: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8730: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
8740: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8750: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
8760: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
8770: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
8780: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8790: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
87a0: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
87b0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
87c0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
87d0: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
87e0: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
87f0: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
8800: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
8810: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
8820: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
8830: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
8840: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
8850: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
8860: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
8870: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
8880: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
8890: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
88a0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
88b0: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
88c0: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
88d0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
88e0: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
88f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
8900: 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 63  utine does NOT c
8910: 6f 72 72 65 63 74 6c 79 20 69 6e 69 74 69 61 6c  orrectly initial
8920: 69 7a 65 20 74 68 65 20 45 78 70 72 2e 64 61 74  ize the Expr.dat
8930: 61 54 79 70 65 20 20 66 69 65 6c 64 0a 2a 2a 20  aType  field.** 
8940: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8950: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 54 68  expressions.  Th
8960: 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72  e multiSelectSor
8970: 74 4f 72 64 65 72 28 29 20 72 6f 75 74 69 6e 65  tOrder() routine
8980: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  .** must be call
8990: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 20 61 66  ed to do that af
89a0: 74 65 72 20 74 68 65 20 69 6e 64 69 76 69 64 75  ter the individu
89b0: 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  al select statem
89c0: 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61 6c 6c  ents.** have all
89d0: 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 20   been analyzed. 
89e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
89f0: 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 75   unable to compu
8a00: 74 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65  te Expr.dataType
8a10: 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 6d  .** because it m
8a20: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
8a30: 66 6f 72 65 20 74 68 65 20 69 6e 64 69 76 69 64  fore the individ
8a40: 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65  ual select state
8a50: 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 62 65  ments.** have be
8a60: 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a  en analyzed..*/.
8a70: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
8a80: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
8a90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8aa0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
8ab0: 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65  place to leave e
8ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
8ad0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
8ae0: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ct,        /* Ma
8af0: 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f  tch to result co
8b00: 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45  lumns of this SE
8b10: 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LECT */.  ExprLi
8b20: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8b30: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
8b40: 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63  Y values to matc
8b50: 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  h against column
8b60: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
8b70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
8b80: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61  * Insert this va
8b90: 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f  lue in iTable */
8ba0: 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c  .  int mustCompl
8bb0: 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ete        /* If
8bc0: 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20   TRUE all ORDER 
8bd0: 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a  BYs must match *
8be0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  /.){.  int nErr 
8bf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
8c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8c10: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  ist;..  if( pSel
8c20: 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72  ect==0 || pOrder
8c30: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  By==0 ) return 1
8c40: 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  ;.  if( mustComp
8c50: 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  lete ){.    for(
8c60: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
8c70: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f  >nExpr; i++){ pO
8c80: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8c90: 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69  e = 0; }.  }.  i
8ca0: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
8cb0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
8cc0: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
8cd0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
8ce0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
8cf0: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
8d00: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
8d10: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
8d20: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
8d30: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
8d40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
8d60: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
8d70: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
8d80: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8d90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8da0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
8db0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8dc0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
8dd0: 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  1;.    if( pOrde
8de0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
8df0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8e00: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
8e10: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
8e20: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
8e30: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
8e40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
8e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8e60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8e70: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
8e80: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
8e90: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
8ea0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
8eb0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
8ec0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8ed0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8f00: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
8f10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
8f20: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
8f30: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
8f40: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
8f50: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
8f60: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
8f70: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
8f80: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
8f90: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
8fa0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8fb0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
8fc0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8fd0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
8fe0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
8ff0: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
9000: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
9010: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
9020: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
9030: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
9040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
9050: 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  uote(zLabel);.  
9060: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9070: 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
9080: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
9090: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
90a0: 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
90b0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
90c0: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
90d0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
90e0: 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
90f0: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69  Compare(pE, pELi
9100: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20  st->a[j].pExpr) 
9110: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  ){.        iCol 
9120: 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = j;.      }.   
9130: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
9140: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
9150: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
9160: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
9170: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
9180: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
9190: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  ble;.      pOrde
91a0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
91b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
91c0: 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74  ( iCol<0 && must
91d0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
91e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
91f0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9200: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
9210: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
9220: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
9230: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
9240: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
9250: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9260: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9270: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
9280: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
9290: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
92a0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
92b0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
92c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
92d0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
92e0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
92f0: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
9300: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9310: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
9320: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
9330: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
9340: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9350: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
9360: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
9370: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
9380: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
9390: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
93a0: 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn v;.}../*.** T
93b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
93c0: 20 74 68 65 20 45 78 70 72 2e 64 61 74 61 54 79   the Expr.dataTy
93d0: 70 65 20 66 69 65 6c 64 20 6f 6e 20 61 6c 6c 20  pe field on all 
93e0: 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  elements of.** t
93f0: 68 65 20 70 4f 72 64 65 72 42 79 20 65 78 70 72  he pOrderBy expr
9400: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68  ession list.  Th
9410: 65 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  e pOrderBy list 
9420: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 2a  will have been.*
9430: 2a 20 73 65 74 20 75 70 20 62 79 20 6d 61 74 63  * set up by matc
9440: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
9450: 28 29 2e 20 20 48 65 6e 63 65 20 65 61 63 68 20  ().  Hence each 
9460: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 0a 2a  expression has.*
9470: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 73  * a TK_COLUMN as
9480: 20 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   its root node. 
9490: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
94a0: 6e 20 72 65 66 65 72 73 20 74 6f 20 61 20 0a 2a  n refers to a .*
94b0: 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  * column in the 
94c0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 20 54 68  result set.   Th
94d0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 73 65  e datatype is se
94e0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 54  t to SQLITE_SO_T
94f0: 45 58 54 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f  EXT.** if the co
9500: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
9510: 6d 6e 20 69 6e 20 70 20 61 6e 64 20 65 76 65 72  mn in p and ever
9520: 79 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  y SELECT to the 
9530: 6c 65 66 74 20 6f 66 0a 2a 2a 20 70 20 68 61 73  left of.** p has
9540: 20 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 53   a datatype of S
9550: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 2e 20 20  QLITE_SO_TEXT.  
9560: 49 66 20 74 68 65 20 63 6f 6f 72 65 73 73 70 6f  If the cooresspo
9570: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  nding column.** 
9580: 69 6e 20 70 20 6f 72 20 61 6e 79 20 6f 66 20 74  in p or any of t
9590: 68 65 20 6c 65 66 74 20 53 45 4c 45 43 54 73 20  he left SELECTs 
95a0: 69 73 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  is SQLITE_SO_NUM
95b0: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 74  , then the datat
95c0: 79 70 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72  ype.** of the or
95d0: 64 65 72 2d 62 79 20 65 78 70 72 65 73 73 69 6f  der-by expressio
95e0: 6e 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  n is set to SQLI
95f0: 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a 2a 2a  TE_SO_NUM..**.**
9600: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
9610: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
9620: 45 20 6f 6e 65 28 61 20 49 4e 54 45 47 45 52 2c  E one(a INTEGER,
9630: 20 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20   b TEXT);.**    
9640: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77   CREATE TABLE tw
9650: 6f 28 63 20 56 41 52 43 48 41 52 28 35 29 2c 20  o(c VARCHAR(5), 
9660: 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a 2a 20  d FLOAT);.**.** 
9670: 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20 62 20      SELECT b, b 
9680: 46 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e 20 53  FROM one UNION S
9690: 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20  ELECT d, c FROM 
96a0: 74 77 6f 20 4f 52 44 45 52 20 42 59 20 31 2c 20  two ORDER BY 1, 
96b0: 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69  2;.**.** The pri
96c0: 6d 61 72 79 20 73 6f 72 74 20 6b 65 79 20 77 69  mary sort key wi
96d0: 6c 6c 20 75 73 65 20 53 51 4c 49 54 45 5f 53 4f  ll use SQLITE_SO
96e0: 5f 4e 55 4d 20 62 65 63 61 75 73 65 20 74 68 65  _NUM because the
96f0: 20 22 64 22 20 69 6e 0a 2a 2a 20 74 68 65 20 73   "d" in.** the s
9700: 65 63 6f 6e 64 20 53 45 4c 45 43 54 20 69 73 20  econd SELECT is 
9710: 6e 75 6d 65 72 69 63 2e 20 20 54 68 65 20 31 73  numeric.  The 1s
9720: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
9730: 66 69 72 73 74 20 53 45 4c 45 43 54 0a 2a 2a 20  first SELECT.** 
9740: 69 73 20 74 65 78 74 20 62 75 74 20 74 68 61 74  is text but that
9750: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
9760: 20 62 65 63 61 75 73 65 20 61 20 6e 75 6d 65 72   because a numer
9770: 69 63 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69  ic always overri
9780: 64 65 73 0a 2a 2a 20 61 20 74 65 78 74 2e 0a 2a  des.** a text..*
9790: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 61  *.** The seconda
97a0: 72 79 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20  ry key will use 
97b0: 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  the SQLITE_SO_TE
97c0: 58 54 20 73 6f 72 74 20 6f 72 64 65 72 20 62 65  XT sort order be
97d0: 63 61 75 73 65 0a 2a 2a 20 62 6f 74 68 20 74 68  cause.** both th
97e0: 65 20 28 73 65 63 6f 6e 64 29 20 22 62 22 20 69  e (second) "b" i
97f0: 6e 20 74 68 65 20 66 69 72 73 74 20 53 45 4c 45  n the first SELE
9800: 43 54 20 61 6e 64 20 74 68 65 20 22 63 22 20 69  CT and the "c" i
9810: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
9820: 53 45 4c 45 43 54 20 68 61 76 65 20 61 20 64 61  SELECT have a da
9830: 74 61 74 79 70 65 20 6f 66 20 74 65 78 74 2e 0a  tatype of text..
9840: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
9850: 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f  multiSelectSortO
9860: 72 64 65 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  rder(Select *p, 
9870: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
9880: 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  By){.  int i;.  
9890: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
98a0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
98b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
98c0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
98d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
98e0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
98f0: 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
9900: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 64 61  ->a[i].pExpr->da
9910: 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  taType = SQLITE_
9920: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  SO_TEXT;.    }. 
9930: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9940: 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74   multiSelectSort
9950: 4f 72 64 65 72 28 70 2d 3e 70 50 72 69 6f 72 2c  Order(p->pPrior,
9960: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 45   pOrderBy);.  pE
9970: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
9980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9990: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
99a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
99b0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
99c0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
99d0: 66 28 20 70 45 2d 3e 64 61 74 61 54 79 70 65 3d  f( pE->dataType=
99e0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29  =SQLITE_SO_NUM )
99f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
9a00: 73 73 65 72 74 28 20 70 45 2d 3e 69 43 6f 6c 75  ssert( pE->iColu
9a10: 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  mn>=0 );.    if(
9a20: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 70   pEList->nExpr>p
9a30: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  E->iColumn ){.  
9a40: 20 20 20 20 70 45 2d 3e 64 61 74 61 54 79 70 65      pE->dataType
9a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 79   = sqlite3ExprTy
9a60: 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 70 45 2d  pe(pEList->a[pE-
9a70: 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 29  >iColumn].pExpr)
9a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9a90: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9aa0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9ab0: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
9ac0: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
9ad0: 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20  n the.** nLimit 
9ae0: 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65 6c  and nOffset fiel
9af0: 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20  ds.  nLimit and 
9b00: 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  nOffset hold the
9b10: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68 61   integers.** tha
9b20: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
9b30: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
9b40: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
9b50: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
9b60: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
9b70: 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31 20  Or that hold -1 
9b80: 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20 6b  and 0 if those k
9b90: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
9ba0: 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  ted..** iLimit a
9bb0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 74  nd iOffset are t
9bc0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
9bd0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
9be0: 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65  rs for.** counte
9bf0: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
9c00: 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  te the limit and
9c10: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
9c20: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69  re is no.** limi
9c30: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
9c40: 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e 64   then iLimit and
9c50: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
9c60: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
9c70: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
9c80: 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20  s the values if 
9c90: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9ca0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
9cb0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
9cc0: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c  is defined by nL
9cd0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
9ce0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
9cf0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
9d00: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
9d10: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
9d20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
9d30: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
9d40: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
9d50: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
9d60: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
9d70: 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d  Only if nLimit>=
9d80: 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64  0 or nOffset>0 d
9d90: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
9da0: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
9db0: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
9dc0: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
9dd0: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
9de0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
9df0: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
9e00: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
9e10: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
9e20: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
9e30: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
9e40: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
9e50: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
9e60: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
9e70: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9e80: 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a   *p){.  /* .  **
9e90: 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
9ea0: 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e  on is p->nLimit>
9eb0: 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22  0 then "LIMIT 0"
9ec0: 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20   shows.  ** all 
9ed0: 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68 65  rows.  It is the
9ee0: 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69   same as no limi
9ef0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  t. If the compar
9f00: 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d  ision is.  ** p-
9f10: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e 20  >nLimit>=0 then 
9f20: 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e  "LIMIT 0" show n
9f30: 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20  o rows at all.. 
9f40: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
9f50: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
9f60: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
9f70: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
9f80: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
9f90: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
9fa0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
9fb0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
9fc0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
9fd0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
9fe0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
9ff0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
a000: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  .  if( p->nLimit
a010: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
a020: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
a030: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
a040: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a050: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
a060: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
a070: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
a080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
a090: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69  teger, -p->nLimi
a0a0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
a0b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a0c0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
a0d0: 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69  , 1);.    p->iLi
a0e0: 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a  mit = iMem;.  }.
a0f0: 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74    if( p->nOffset
a100: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  >0 ){.    int iM
a110: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a120: 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  m++;.    Vdbe *v
a130: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a140: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a150: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a170: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a180: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65  eger, -p->nOffse
a190: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
a1a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a1b0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
a1c0: 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66  , 1);.    p->iOf
a1d0: 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d  fset = iMem;.  }
a1e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a1f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a200: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
a210: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
a220: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
a230: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
a240: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
a250: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
a260: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
a270: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
a280: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
a290: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
a2a0: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
a2b0: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
a2c0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
a2d0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
a2e0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
a2f0: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
a300: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
a310: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
a320: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
a330: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
a340: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
a350: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
a360: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
a370: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
a380: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
a390: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
a3a0: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
a3b0: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
a3c0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
a3d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a3e0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
a3f0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
a400: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
a410: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
a420: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
a430: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
a440: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
a450: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
a460: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
a470: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
a480: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
a490: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
a4a0: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
a4c0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
a4d0: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
a4e0: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
a4f0: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
a500: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
a510: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
a520: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
a530: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a540: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
a550: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
a560: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
a570: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
a580: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
a590: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
a5a0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
a5b0: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
a5c0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
a5d0: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
a5e0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
a5f0: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
a600: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
a610: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
a620: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
a630: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
a640: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
a650: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
a660: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
a670: 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63  iParm){.  int rc
a680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a690: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
a6a0: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
a6b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
a6c0: 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74  ior;     /* Anot
a6d0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
a6e0: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
a6f0: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
a700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
a710: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
a720: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20  this VDBE */..  
a730: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
a740: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
a750: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
a760: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
a770: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
a780: 68 65 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  he last SELECT i
a790: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
a7a0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
a7b0: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
a7c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a7d0: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
a7e0: 74 75 72 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72  turn 1;.  pPrior
a7f0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
a800: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
a810: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
a820: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a830: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
a840: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
a850: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
a860: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
a870: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
a880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
a890: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
a8a0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70  ->nLimit>=0 || p
a8b0: 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30  Prior->nOffset>0
a8c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a8d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
a8e0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
a8f0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
a900: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
a910: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
a920: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
a930: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
a940: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
a950: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
a960: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
a970: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
a980: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
a990: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a9a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
a9b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a9c0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
a9d0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
a9e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
a9f0: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
aa00: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
aa10: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
aa20: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
aa30: 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
aa40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa50: 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
aa60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
aa70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa80: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
aa90: 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  iParm, p->pEList
aaa0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 65 44  ->nExpr);.    eD
aab0: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
aac0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
aad0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
aae0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
aaf0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ab00: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
ab10: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
ab20: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
ab30: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
ab40: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
ab50: 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74    pPrior->nLimit
ab60: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
ab70: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f        pPrior->nO
ab80: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
ab90: 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  et;.        rc =
aba0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
abb0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65  Parse, pPrior, e
abc0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
abd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
abe0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
abf0: 63 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  c;.        p->pP
ac00: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ac10: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
ac20: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
ac30: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
ac40: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
ac50: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  et;.        p->n
ac60: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
ac70: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
ac80: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
ac90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
aca0: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
acb0: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29   iParm, 0, 0, 0)
acc0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
acd0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
ace0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
acf0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ad10: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
ad20: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
ad30: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
ad40: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
ad50: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
ad60: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
ad70: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
ad80: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
ad90: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
ada0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
adb0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
adc0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
add0: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
ade0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
adf0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
ae00: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
ae10: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
ae20: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
ae30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
ae40: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
ae50: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
ae60: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  lects */.      i
ae70: 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73  nt nLimit, nOffs
ae80: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
ae90: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
aea0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
aeb0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
aec0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
aed0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
aee0: 61 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67  ause for the rig
aef0: 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ht SELECT */..  
af00: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
af10: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
af20: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
af30: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
af40: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
af50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
af60: 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26  && p->nLimit<0 &
af70: 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20  & p->nOffset==0 
af80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
af90: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
afa0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
afb0: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
afc0: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
afd0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
afe0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
aff0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
b000: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b010: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
b020: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
b030: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
b040: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
b050: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
b060: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
b070: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
b080: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
b090: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b0a0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
b0b0: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
b0c0: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
b0d0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b0e0: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
b0f0: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
b100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b110: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
b120: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
b130: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
b140: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b160: 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54  OpenTemp, unionT
b170: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
b180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b190: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
b1a0: 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  ta, unionTab, 1)
b1b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b1c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b1d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b1e0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f  P_OpenTemp, unio
b1f0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
b200: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
b210: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
b220: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b230: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
b240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
b250: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
b260: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
b270: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
b280: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b290: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b2a0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
b2b0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
b2c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b2d0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
b2e0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
b2f0: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
b300: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
b310: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
b320: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
b330: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
b340: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
b350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b360: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
b370: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
b380: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
b390: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
b3a0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
b3b0: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
b3c0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
b3d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
b3e0: 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70        nLimit = p
b3f0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->nLimit;.      
b400: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
b410: 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20        nOffset = 
b420: 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->nOffset;.    
b430: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
b440: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b450: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b460: 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54  e, p, op, unionT
b470: 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, 0, 0, 0);.  
b480: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
b490: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
b4a0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
b4b0: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  erBy;.      p->n
b4c0: 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a  Limit = nLimit;.
b4d0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b4e0: 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20   = nOffset;.    
b4f0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b500: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
b510: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
b520: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
b530: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
b540: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
b550: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
b560: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
b570: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
b580: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
b590: 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
b5a0: 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a  onTab!=iParm ){.
b5b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
b5c0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
b5d0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
b5e0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
b5f0: 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73          if( eDes
b600: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
b610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
b620: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
b630: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
b640: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
b650: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b660: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
b670: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
b680: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b690: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
b6a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
b6b0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
b6c0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
b6d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
b6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b6f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
b700: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
b710: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b720: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
b730: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
b740: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  p);.        iSta
b750: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
b760: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
b770: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c          multiSel
b780: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20  ectSortOrder(p, 
b790: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
b7a0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
b7b0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
b7c0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
b7d0: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
b7e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
b810: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
b820: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
b850: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
b860: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
b870: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b880: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
b890: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
b8a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
b8c0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
b8d0: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
b8e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b8f0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b910: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b920: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
b930: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b940: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
b950: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
b960: 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c  teSortTail(p, v,
b970: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
b980: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
b990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b9a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b9b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b9c0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
b9d0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
b9e0: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
b9f0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
ba00: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  Start;.      int
ba10: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
ba20: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
ba30: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
ba40: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
ba50: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
ba60: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
ba70: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
ba80: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
ba90: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
baa0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
bab0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
bac0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
bad0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
bae0: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
baf0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
bb00: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
bb10: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
bb20: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
bb30: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
bb40: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
bb50: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
bb60: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
bb70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
bb80: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
bb90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
bba0: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31  penTemp, tab1, 1
bbb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bbc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bbd0: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
bbe0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   1);..      /* C
bbf0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
bc00: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
bc10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bc20: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
bc30: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
bc40: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
bc50: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
bc60: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
bc70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
bc80: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
bc90: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
bca0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
bcb0: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
bcc0: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
bcd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
bce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bcf0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
bd00: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  b2, 1);.      sq
bd10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bd20: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
bd30: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
bd40: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
bd50: 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d       nLimit = p-
bd60: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >nLimit;.      p
bd70: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
bd80: 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70       nOffset = p
bd90: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
bda0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
bdb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bdc0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
bdd0: 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  , p, SRT_Union, 
bde0: 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tab2, 0, 0, 0);.
bdf0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
be00: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
be10: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  p->nLimit = nLim
be20: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  it;.      p->nOf
be30: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
be40: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
be50: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
be60: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
be70: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
be80: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
be90: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
bea0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
beb0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bec0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
bed0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
bee0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
bef0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
bf00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
bf10: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
bf20: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
bf30: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
bf40: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ypes(pParse, p->
bf50: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
bf60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bf70: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
bf80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
bf90: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
bfa0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
bfb0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
bfc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bfd0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
bfe0: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
bff0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
c000: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
c010: 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72   p);.      iStar
c020: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
c030: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b  ddOp(v, OP_FullK
c040: 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
c050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c060: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
c070: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
c080: 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65  );.      multiSe
c090: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c  lectSortOrder(p,
c0a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
c0b0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
c0c0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
c0d0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
c0e0: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
c0f0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
c120: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
c130: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29    iCont, iBreak)
c160: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c170: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
c180: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c190: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
c1a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c1b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c1c0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
c1d0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
c1e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
c1f0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
c200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c210: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c220: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
c230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c240: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c250: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
c260: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
c270: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  y ){.        gen
c280: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
c290: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
c2a0: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
c2b0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
c2c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c2d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
c2e0: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
c2f0: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
c300: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
c310: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
c320: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
c330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c340: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
c350: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
c360: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
c370: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
c380: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
c390: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
c3a0: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
c3b0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
c3c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c3d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c3e0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
c3f0: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
c400: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
c410: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
c420: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
c430: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
c440: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
c450: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
c460: 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
c470: 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
c480: 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
c490: 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
c4a0: 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
c4b0: 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
c4c0: 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
c4d0: 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
c4e0: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
c4f0: 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
c500: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
c510: 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
c520: 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
c530: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
c540: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
c550: 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
c560: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
c570: 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
c580: 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
c590: 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
c5a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
c5b0: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
c5c0: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
c5d0: 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
c5e0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
c5f0: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
c600: 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
c610: 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
c620: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
c630: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
c640: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
c650: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
c660: 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73  ist*,int,ExprLis
c670: 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  t*);  /* Forward
c680: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
c690: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
c6a0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
c6b0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
c6c0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
c6d0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
c6e0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
c6f0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
c700: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
c710: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
c720: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
c730: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
c740: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
c750: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c760: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
c770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
c780: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
c790: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
c7a0: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
c7b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
c7c0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
c7d0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
c7e0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
c7f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
c800: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
c810: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
c820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
c830: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
c840: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
c850: 3e 6f 70 3b 0a 20 20 20 20 20 20 70 45 78 70 72  >op;.      pExpr
c860: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 4e 65  ->dataType = pNe
c870: 77 2d 3e 64 61 74 61 54 79 70 65 3b 0a 20 20 20  w->dataType;.   
c880: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c890: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
c8a0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
c8b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c8c0: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
c8d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
c8e0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
c8f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
c900: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
c910: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
c920: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
c930: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
c940: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
c950: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
c960: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
c970: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
c980: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
c990: 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
c9a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
c9b0: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
c9c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
c9d0: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
c9e0: 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
c9f0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
ca00: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
ca10: 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
ca20: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
ca30: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
ca40: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
ca50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ca60: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
ca70: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
ca80: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
ca90: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
caa0: 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
cab0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
cac0: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
cad0: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
cae0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
caf0: 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62  static void .sub
cb00: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
cb10: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
cb20: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
cb30: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
cb40: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
cb50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
cb60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
cb70: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cb80: 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73    substExpr(pLis
cb90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
cba0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
cbb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
cbc0: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
cbd0: 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
cbe0: 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
cbf0: 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
cc00: 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
cc10: 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
cc20: 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
cc30: 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
cc40: 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
cc50: 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
cc60: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
cc70: 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
cc80: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
cc90: 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
cca0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
ccb0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
ccc0: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
ccd0: 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
cce0: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
ccf0: 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
cd00: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
cd10: 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
cd20: 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
cd30: 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
cd40: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
cd50: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
cd60: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
cd70: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
cd80: 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
cd90: 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
cda0: 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
cdb0: 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
cdc0: 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
cdd0: 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
cde0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cdf0: 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
ce00: 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
ce10: 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
ce20: 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
ce30: 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
ce40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ce50: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
ce60: 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
ce70: 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
ce80: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
ce90: 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
cea0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
ceb0: 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
cec0: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
ced0: 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
cee0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
cef0: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
cf00: 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
cf10: 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
cf20: 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
cf30: 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
cf40: 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
cf50: 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
cf60: 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
cf70: 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
cf80: 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
cf90: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
cfa0: 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
cfb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
cfc0: 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
cfd0: 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
cfe0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
cff0: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
d000: 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
d010: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
d020: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
d030: 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
d040: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
d050: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d060: 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
d070: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d080: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
d090: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
d0a0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d0b0: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
d0c0: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
d0d0: 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
d0e0: 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
d0f0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
d100: 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
d110: 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
d120: 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
d130: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
d140: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
d150: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
d160: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
d170: 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
d180: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
d190: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d1a0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
d1b0: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
d1c0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
d1d0: 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
d1e0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
d1f0: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
d200: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
d210: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
d220: 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
d230: 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
d240: 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
d250: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
d260: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
d270: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
d280: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d290: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
d2a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
d2b0: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
d2c0: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
d2d0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
d2e0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
d2f0: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
d300: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
d310: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d320: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
d330: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
d340: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
d350: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
d360: 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
d370: 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
d380: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
d390: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
d3a0: 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
d3b0: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
d3c0: 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
d3d0: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
d3e0: 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
d3f0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
d400: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
d410: 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
d420: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
d430: 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
d440: 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  #350).**.** In t
d450: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
d460: 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
d470: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
d480: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
d490: 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
d4a0: 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
d4b0: 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
d4c0: 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
d4d0: 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
d4e0: 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
d4f0: 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
d500: 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
d510: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
d520: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
d530: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
d540: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
d550: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d560: 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
d570: 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
d580: 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
d590: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
d5a0: 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
d5b0: 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
d5c0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
d5d0: 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
d5e0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d5f0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
d600: 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
d610: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
d620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
d630: 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
d640: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d650: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
d660: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d670: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
d680: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
d690: 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
d6a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
d6b0: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
d6c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d6d0: 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
d6e0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
d6f0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
d700: 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
d710: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
d720: 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
d730: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
d740: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
d750: 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
d760: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
d770: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
d780: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
d790: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
d7a0: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
d7b0: 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
d7c0: 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
d7d0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
d7e0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
d7f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
d800: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
d810: 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
d820: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
d830: 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
d840: 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
d850: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
d860: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
d870: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
d880: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
d890: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
d8a0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
d8b0: 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
d8c0: 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
d8d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ble */.  int i;.
d8e0: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a    Expr *pWhere;.
d8f0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
d900: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
d910: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
d920: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
d930: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
d940: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
d950: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
d960: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
d970: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
d980: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
d990: 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e  .  pSub = pSrc->
d9a0: 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74  a[iFrom].pSelect
d9b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
d9c0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
d9d0: 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
d9e0: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
d9f0: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
da00: 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
da10: 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  c>1 ) return 0;.
da20: 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
da30: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
da40: 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69  ( pSubSrc );.  i
da50: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
da60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
da70: 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44    if( (pSub->isD
da80: 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
da90: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20  >nLimit>=0) &&  
daa0: 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
dab0: 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
dac0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
dad0: 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e  if( (p->isDistin
dae0: 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e  ct || p->nLimit>
daf0: 3d 30 29 20 26 26 20 73 75 62 71 75 65 72 79 49  =0) && subqueryI
db00: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
db10: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
db20: 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
db30: 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
db40: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
db50: 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
db60: 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
db70: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
db80: 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
db90: 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
dba0: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
dbb0: 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
dbc0: 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
dbd0: 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
dbe0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
dbf0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
dc00: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
dc10: 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
dc20: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
dc30: 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
dc40: 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
dc50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
dc60: 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
dc70: 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
dc80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
dc90: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
dca0: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
dcb0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
dcc0: 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72  c->nSrc>1 && iFr
dcd0: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
dce0: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
dcf0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
dd00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dd10: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
dd20: 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
dd30: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
dd40: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
dd50: 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
dd60: 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
dd70: 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
dd80: 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
dd90: 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
dda0: 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
ddb0: 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
ddc0: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
ddd0: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
dde0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
ddf0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
de00: 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
de10: 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
de20: 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
de30: 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
de40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
de50: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
de60: 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
de70: 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
de80: 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
de90: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
dea0: 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
deb0: 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
dec0: 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
ded0: 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
dee0: 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
def0: 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
df00: 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
df10: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
df20: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
df30: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
df40: 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
df50: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
df60: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
df70: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
df80: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
df90: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
dfa0: 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
dfb0: 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
dfc0: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
dfd0: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
dfe0: 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
dff0: 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
e000: 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
e010: 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
e020: 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
e030: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
e040: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
e050: 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
e060: 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
e070: 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
e080: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
e090: 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
e0a0: 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
e0b0: 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
e0c0: 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
e0d0: 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
e0e0: 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
e0f0: 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
e100: 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
e110: 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
e120: 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
e130: 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
e140: 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
e150: 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
e160: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
e170: 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
e180: 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
e190: 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
e1a0: 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
e1b0: 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
e1c0: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
e1d0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ].iCursor;.  {. 
e1e0: 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
e1f0: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
e200: 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
e210: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
e220: 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ].jointype;..   
e230: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72   if( pSrc->a[iFr
e240: 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63  om].pTab && pSrc
e250: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  ->a[iFrom].pTab-
e260: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
e270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
e280: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63  eteTable(0, pSrc
e290: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29  ->a[iFrom].pTab)
e2a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e2b0: 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69  teFree(pSrc->a[i
e2c0: 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65 29  From].zDatabase)
e2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e2e0: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
e2f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
e300: 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69  teFree(pSrc->a[i
e310: 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  From].zAlias);. 
e320: 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
e330: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
e340: 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
e350: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
e360: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
e370: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
e380: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
e390: 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
e3a0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e3b0: 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
e3c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
e3d0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
e3e0: 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
e3f0: 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
e400: 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
e410: 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
e420: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
e430: 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
e440: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
e450: 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
e460: 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
e470: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
e480: 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
e490: 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
e4a0: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
e4b0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
e4c0: 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
e4d0: 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
e4e0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
e4f0: 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
e500: 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
e510: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
e520: 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
e530: 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
e540: 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
e550: 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
e560: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
e570: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
e580: 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
e590: 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
e5a0: 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
e5b0: 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
e5c0: 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
e5d0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
e5e0: 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
e5f0: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
e600: 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
e610: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
e620: 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
e630: 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
e640: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e650: 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
e660: 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
e670: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
e680: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
e690: 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
e6a0: 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
e6b0: 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
e6c0: 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
e6d0: 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
e6e0: 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
e6f0: 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
e700: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
e710: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
e720: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
e730: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
e740: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e750: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e760: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
e770: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
e780: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
e790: 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
e7a0: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
e7b0: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
e7c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
e7d0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
e7e0: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
e7f0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
e800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e810: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
e820: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
e830: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
e840: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
e850: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
e860: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
e870: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e880: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
e890: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
e8a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
e8b0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
e8c0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
e8d0: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
e8e0: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
e8f0: 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
e900: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
e910: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
e920: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
e930: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
e940: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
e950: 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
e960: 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
e970: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
e980: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
e990: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
e9a0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
e9b0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
e9c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e9d0: 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
e9e0: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
e9f0: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
ea00: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
ea10: 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
ea20: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
ea30: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
ea40: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  st);.    if( pSu
ea50: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
ea60: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
ea70: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
ea80: 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
ea90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
eaa0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
eab0: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
eac0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
ead0: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
eae0: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
eaf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb00: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
eb10: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
eb20: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
eb30: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
eb40: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
eb50: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
eb60: 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
eb70: 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
eb80: 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d  e if( p->pWhere=
eb90: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68  =0 ){.    p->pWh
eba0: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
ebb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
ebc0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
ebd0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
ebe0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
ebf0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
ec00: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
ec10: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
ec20: 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  p->pWhere, pWher
ec30: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
ec40: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
ec50: 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
ec60: 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
ec70: 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
ec80: 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
ec90: 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
eca0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
ecb0: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
ecc0: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
ecd0: 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
ece0: 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69   Transfer the li
ecf0: 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66  mit expression f
ed00: 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
ed10: 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20   to the outer.  
ed20: 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ** query..  */. 
ed30: 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
ed40: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
ed50: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
ed60: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
ed70: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
ed80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
ed90: 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
eda0: 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
edb0: 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
edc0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
edd0: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
ede0: 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
edf0: 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
ee00: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
ee10: 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
ee20: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69  Offset;..  /* Fi
ee30: 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
ee40: 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
ee50: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
ee60: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
ee70: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
ee80: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ee90: 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
eea0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
eeb0: 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
eec0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
eed0: 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
eee0: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
eef0: 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
ef00: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
ef10: 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
ef20: 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
ef30: 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
ef40: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
ef50: 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
ef60: 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
ef70: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
ef80: 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
ef90: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
efa0: 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
efb0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
efc0: 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
efd0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
efe0: 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
eff0: 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
f000: 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
f010: 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
f020: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
f030: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
f040: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
f050: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
f060: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
f070: 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
f080: 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
f090: 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
f0a0: 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
f0b0: 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
f0c0: 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
f0d0: 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
f0e0: 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
f0f0: 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
f100: 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
f110: 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
f120: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
f130: 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
f140: 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
f150: 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
f160: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
f170: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
f180: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
f190: 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
f1a0: 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
f1b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
f1c0: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
f1d0: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
f1e0: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
f1f0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
f200: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
f210: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
f220: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
f230: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
f240: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
f250: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
f260: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
f270: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
f280: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
f290: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
f2a0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
f2b0: 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
f2c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
f2d0: 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
f2e0: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
f2f0: 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
f300: 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
f310: 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20  *pSrc;.  ..  /* 
f320: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
f330: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
f340: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
f350: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
f360: 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
f370: 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
f380: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
f390: 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
f3a0: 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
f3b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
f3c0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
f3d0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
f3e0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
f3f0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
f400: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
f410: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
f420: 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
f430: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
f440: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
f450: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
f460: 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
f470: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
f480: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
f490: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
f4a0: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
f4b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
f4c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
f4d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f4e0: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
f4f0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
f500: 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
f510: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
f520: 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20  Rewind;.  }else 
f530: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
f540: 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
f550: 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
f560: 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
f570: 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
f580: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f590: 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69   }.  pExpr = pLi
f5a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
f5b0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
f5c0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
f5d0: 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
f5e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
f5f0: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
f600: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
f610: 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72  If we get to her
f620: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
f630: 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20  query is of the 
f640: 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20  correct form..  
f650: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
f660: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e   sure we have an
f670: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20   index and make 
f680: 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  pIdx point to th
f690: 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61  e.  ** appropria
f6a0: 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  te index.  If th
f6b0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
f6c0: 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45   is on an INTEGE
f6d0: 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b  R PRIMARY.  ** k
f6e0: 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e  ey column, no in
f6f0: 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79  dex is necessary
f700: 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20   so set pIdx to 
f710: 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a  NULL.  If no.  *
f720: 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69  * usable index i
f730: 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  s found, return 
f740: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43  0..  */.  if( iC
f750: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ol<0 ){.    pIdx
f760: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
f770: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
f780: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
f790: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
f7a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f7b0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
f7c0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
f7d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
f7e0: 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  ==iCol ) break;.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
f800: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
f810: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
f820: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65  tify column type
f830: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
f840: 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
f850: 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
f860: 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
f870: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
f880: 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
f890: 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
f8a0: 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75  l..  ** The colu
f8b0: 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c  mn names have al
f8c0: 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72  ready been gener
f8d0: 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c  ated in the call
f8e0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  ing function..  
f8f0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
f900: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f910: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
f920: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 65 44  turn 0;.  if( eD
f930: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
f940: 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
f950: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
f960: 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  rse, p->pSrc, p-
f970: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
f980: 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
f990: 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
f9a0: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
f9b0: 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
f9c0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
f9d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
f9e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
f9f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fa00: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
fa10: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
fa20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fa30: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
fa40: 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  s, iParm, 1);.  
fa50: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
fa60: 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
fa70: 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
fa80: 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
fa90: 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
faa0: 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
fab0: 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
fac0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
fad0: 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
fae0: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
faf0: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
fb00: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
fb10: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
fb20: 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
fb30: 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
fb40: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
fb50: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
fb60: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
fb70: 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ma(pParse, pTab-
fb80: 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20  >iDb);.  base = 
fb90: 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
fba0: 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  or;.  computeLim
fbb0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
fbc0: 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53  se, p);.  if( pS
fbd0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
fbe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fbf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fc00: 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
fc10: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
fc20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fc30: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
fc40: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  e, pTab->tnum, p
fc50: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
fc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
fc80: 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20  mColumns, base, 
fc90: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d  pTab->nCol);.  }
fca0: 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
fcb0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fcc0: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
fcd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fce0: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
fcf0: 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
fd00: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
fd10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fd20: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
fd30: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
fd40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fd50: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
fd60: 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  e+1, pIdx->tnum,
fd70: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pIdx->zName, P3
fd80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
fd90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fda0: 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31  , seekOp, base+1
fdb0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fdc0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fdd0: 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b  _IdxRecno, base+
fde0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fdf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fe00: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c  P_Close, base+1,
fe10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
fe20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fe30: 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29  MoveTo, base, 0)
fe40: 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
fe50: 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
fe60: 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
fe70: 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
fe80: 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
fe90: 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
fea0: 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
feb0: 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63  = pExpr;.  selec
fec0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
fed0: 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c  e, p, &eList, 0,
fee0: 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74   0, 0, -1, eDest
fef0: 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63  , iParm, cont, c
ff00: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ont);.  sqlite3V
ff10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ff20: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
ff30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ff40: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
ff50: 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
ff60: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  1;.}../*.** Gene
ff70: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
ff80: 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
ff90: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
ffa0: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
ffb0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
ffc0: 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
ffd0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
ffe0: 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
fff0: 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
10000 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
10010 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
10020 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10030 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10060 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
10070 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
10080 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
10090 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
100a0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
100b0 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
100c0 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
100d0 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
100e0 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
100f0 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
10100 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
10110 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
10120 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
10130 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
10140 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
10150 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
10160 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10170 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
10180 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
10190 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
101a0 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
101b0 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
101c0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
101d0 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
101e0 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
101f0 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
10200 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
10210 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
10220 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
10230 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
10240 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
10250 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
10260 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
10270 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
10280 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
10290 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
102a0 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
102b0 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
102c0 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
102d0 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
102e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
102f0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
10300 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
10310 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
10320 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
10330 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
10340 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
10350 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
10360 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
10370 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
10380 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
10390 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
103a0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
103b0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
103c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
103d0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
103e0 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
103f0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
10400 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
10410 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
10420 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
10430 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
10440 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
10450 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
10460 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
10470 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
10480 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
10490 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
104a0 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
104b0 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
104c0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
104d0 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
104e0 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
104f0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
10500 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
10510 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
10520 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
10530 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
10540 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
10550 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
10560 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
10570 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
10580 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
10590 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
105a0 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
105b0 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
105c0 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
105d0 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
10600 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
10610 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
10660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10670 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
10680 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10690 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
106a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
106b0 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
106c0 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
106d0 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
106e0 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
106f0 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
10700 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
10710 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10720 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
10730 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
10740 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
10750 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
10760 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
10770 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
10780 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
10790 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
107a0 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
107b0 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
107c0 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
107d0 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
107e0 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
107f0 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
10800 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
10810 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
10820 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
10830 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
10840 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
10850 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10860 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
10870 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
10880 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
10890 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
108a0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
108b0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
108c0 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
108d0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
108e0 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
108f0 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
10900 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
10910 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
10920 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
10930 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
10940 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
10950 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
10960 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
10970 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
10980 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
10990 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
109a0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
109b0 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
109c0 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
109d0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
109e0 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20 2f  rentAgg        /
109f0 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
10a00 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
10a10 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
10a20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
10a30 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
10a40 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
10a50 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20  isAgg = 0;      
10a60 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
10a70 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
10a80 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
10a90 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10aa0 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
10ab0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
10ac0 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
10ad0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
10ae0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
10af0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
10b00 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
10b10 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
10b20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
10b30 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
10b40 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
10b50 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
10b60 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
10b70 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
10b80 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
10b90 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
10ba0 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
10bb0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
10bc0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
10bd0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
10be0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
10bf0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
10c00 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
10c10 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
10c20 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
10c30 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
10c40 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
10c50 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
10c60 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
10c70 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
10c80 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
10c90 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
10ca0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
10cb0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
10cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
10cd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
10ce0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
10cf0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
10d00 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  p==0 ) return 1;
10d10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10d20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10d30 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
10d40 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
10d50 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   1;..  /* If the
10d60 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
10d70 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
10d80 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
10d90 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
10da0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
10db0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
10dc0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
10dd0 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
10de0 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  rm);.  }..  /* M
10df0 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
10e00 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
10e10 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
10e20 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
10e30 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
10e40 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
10e50 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  re;.  pOrderBy =
10e60 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10e70 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
10e80 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
10e90 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
10ea0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
10eb0 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
10ec0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44 42   /* Allocate VDB
10ed0 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20 65 61  E cursors for ea
10ee0 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
10ef0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
10f00 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
10f10 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
10f20 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
10f30 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
10f40 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
10f50 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
10f60 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
10f70 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
10f80 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
10f90 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
10fa0 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
10fb0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
10fc0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
10fd0 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64  nd;..  /* Expand
10fe0 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69   any "*" terms i
10ff0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
11000 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20  .  (For example 
11010 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20  the "*" in.  ** 
11020 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
11030 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43  1")  The fillInC
11040 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74  olumnlist() rout
11050 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f  ine also does so
11060 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f  me.  ** other ho
11070 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65  usekeeping - see
11080 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
11090 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ent for details.
110a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c  .  */.  if( fill
110b0 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
110c0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
110d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
110e0 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70    }.  pWhere = p
110f0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69  ->pWhere;.  pELi
11100 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11110 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
11120 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
11130 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
11140 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
11150 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
11160 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
11170 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
11180 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
11190 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52    if( (eDest==SR
111a0 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
111b0 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69  SRT_Set) && pELi
111c0 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20  st->nExpr>1 ){. 
111d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
111e0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
111f0 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
11200 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
11210 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
11220 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
11230 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
11240 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
11250 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
11260 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
11270 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
11280 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
11290 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
112a0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
112b0 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
112c0 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
112d0 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
112e0 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
112f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
11300 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
11310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
11320 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
11330 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
11340 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
11350 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
11360 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
11370 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
11380 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
11390 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
113a0 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
113b0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
113c0 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
113d0 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
113e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
113f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11400 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
11410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11420 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
11430 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
11440 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73  abList, 0, pELis
11450 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
11460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11470 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11480 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11490 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
114a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
114b0 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
114c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
114d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
114e0 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
114f0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11500 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
11510 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11520 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
11530 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
11540 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11550 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11560 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
11570 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
11580 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11590 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
115a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76  }.  }.  if( pHav
115b0 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ing ){.    if( p
115c0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
115d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
115e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47  Msg(pParse, "a G
115f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
11600 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
11610 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20  e HAVING");.    
11620 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11630 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11640 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11650 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11660 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11670 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
11680 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11690 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
116a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
116b0 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
116c0 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  ng, 1, &isAgg) )
116d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
116e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
116f0 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42   }.  if( pOrderB
11700 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
11710 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
11720 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
11730 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
11740 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
11750 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11760 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11770 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11780 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69  (pE, &iCol) && i
11790 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
117a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
117b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
117c0 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
117d0 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64         pE = pOrd
117e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
117f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11800 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
11810 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
11820 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
11830 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
11840 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11850 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
11860 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
11870 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11880 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11890 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
118a0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
118b0 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
118c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
118d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
118e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
118f0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
11900 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11910 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
11920 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
11930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11940 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11950 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11960 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
11970 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
11980 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
11990 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ants");.        
119a0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
119b0 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
119c0 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
119d0 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
119e0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
119f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11a00 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
11a10 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
11a20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
11a30 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
11a40 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
11a50 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
11a60 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
11a70 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
11a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
11a90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11ab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11ac0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
11ad0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
11ae0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
11af0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11b00 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
11b10 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11b20 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
11b30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11b40 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
11b50 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20  l) && iCol>0 && 
11b60 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
11b70 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
11b80 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11b90 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
11ba0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11bb0 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
11bc0 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
11bd0 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
11be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11bf0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11c00 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11c10 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
11c20 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
11c30 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11c40 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11c50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11c60 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
11c70 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
11c80 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11c90 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11ca0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
11cb0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11cc0 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
11cd0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11ce0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
11cf0 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
11d00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11d10 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
11d20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20           "GROUP 
11d30 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f  BY terms must no
11d40 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72  t be non-integer
11d50 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20   constants");.  
11d60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11d70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
11d80 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c   }else if( iCol<
11d90 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
11da0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11dc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
11dd0 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55             "GROU
11de0 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  P BY column numb
11df0 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
11e00 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
11e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
11e20 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
11e30 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
11e40 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
11e50 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11e60 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
11e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11e80 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
11e90 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
11ea0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
11eb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11ec0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
11ed0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
11ee0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
11ef0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
11f00 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
11f10 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
11f20 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
11f30 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
11f40 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
11f50 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
11f60 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
11f70 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
11f80 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
11f90 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
11fa0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
11fb0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
11fc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
11fd0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
11fe0 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
11ff0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
12000 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  e.  */.  for(i=0
12010 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
12020 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
12030 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
12040 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
12050 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65   int needRestore
12060 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66  Context;..    if
12070 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
12080 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  .pSelect==0 ) co
12090 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
120a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
120b0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
120c0 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
120d0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
120e0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
120f0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
12100 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74  ntext = pTabList
12110 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
12120 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
12130 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20  ontext = 1;.    
12140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65  }else{.      nee
12150 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
12160 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
12170 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12180 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
12190 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
121a0 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20  _TempTable, .   
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
121c0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
121d0 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41  rsor, p, i, &isA
121e0 67 67 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  gg);.    if( nee
121f0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
12200 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
12210 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
12220 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
12230 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
12240 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
12250 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
12260 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
12270 20 65 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f   eDest!=SRT_Unio
12280 6e 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  n && eDest!=SRT_
12290 45 78 63 65 70 74 20 26 26 20 65 44 65 73 74 21  Except && eDest!
122a0 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a  =SRT_Discard ){.
122b0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
122c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
122d0 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
122e0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
122f0 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
12300 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
12310 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
12320 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20  Distinct;.  }.. 
12330 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
12340 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
12350 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
12360 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
12370 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
12380 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
12390 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
123a0 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
123b0 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
123c0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
123d0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
123e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
123f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
12400 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
12410 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
12420 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
12430 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
12440 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
12450 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
12460 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
12470 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
12480 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
12490 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
124a0 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
124b0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
124c0 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72  se, pParent, par
124d0 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74  entTab, *pParent
124e0 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  Agg, isAgg) ){. 
124f0 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a     if( isAgg ) *
12500 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a  pParentAgg = 1;.
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12520 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
12530 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
12540 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
12550 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
12560 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
12570 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69  y column types i
12580 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
12590 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  ng a callback.  
125a0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
125b0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
125c0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
125d0 20 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f   to a destinatio
125e0 6e 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  n other.  ** tha
125f0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20  n a callback..  
12600 2a 2a 0a 20 20 2a 2a 20 57 65 20 68 61 76 65 20  **.  ** We have 
12610 74 6f 20 64 6f 20 74 68 69 73 20 73 65 70 61 72  to do this separ
12620 61 74 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 63  ately from the c
12630 72 65 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d  reation of colum
12640 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 62 6f  n names.  ** abo
12650 76 65 20 62 65 63 61 75 73 65 20 69 66 20 74 68  ve because if th
12660 65 20 70 54 61 62 4c 69 73 74 20 63 6f 6e 74 61  e pTabList conta
12670 69 6e 73 20 76 69 65 77 73 20 74 68 65 6e 20 74  ins views then t
12680 68 65 79 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  hey will not.  *
12690 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  * have been reso
126a0 6c 76 65 64 20 61 6e 64 20 77 65 20 77 69 6c 6c  lved and we will
126b0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 63 6f   not know the co
126c0 6c 75 6d 6e 20 74 79 70 65 73 20 75 6e 74 69 6c  lumn types until
126d0 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
126e0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
126f0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
12700 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
12710 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
12720 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
12730 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12740 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
12750 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
12760 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
12770 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
12780 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12790 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
127a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
127b0 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
127c0 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
127d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
127e0 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
127f0 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20  Columns, iParm, 
12800 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
12810 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20    }..  /* Do an 
12820 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72  analysis of aggr
12830 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  egate expression
12840 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
12850 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
12860 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  et(pParse);.  if
12870 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
12880 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBy ){.    asser
12890 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d  t( pParse->nAgg=
128a0 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20  =0 );.    isAgg 
128b0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
128c0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
128d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
128e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
128f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
12900 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
12910 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
12920 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12930 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
12940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
12950 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
12960 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
12970 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
12980 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
12990 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
129a0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
129b0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
129c0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
129d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
129e0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
129f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12a00 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
12a10 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
12a20 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12a30 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
12a40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12a50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12a60 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
12a70 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
12a80 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
12a90 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12aa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12ab0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
12ac0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
12ad0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12ae0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
12af0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12b00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12b10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12b20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  /* Reset the agg
12b30 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69  regator.  */.  i
12b40 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
12b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b60 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c  (v, OP_AggReset,
12b70 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67   0, pParse->nAgg
12b80 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
12b90 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
12ba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  i++){.      Func
12bb0 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  Def *pFunc;.    
12bc0 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70    if( (pFunc = p
12bd0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
12be0 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e  Func)!=0 && pFun
12bf0 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  c->xFinalize!=0 
12c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12c10 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
12c20 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28  AggInit, 0, i, (
12c30 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f  char*)pFunc, P3_
12c40 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20  POINTER);.      
12c50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12c60 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
12c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
12c90 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
12ca0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12cb0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
12cc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
12cd0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
12ce0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
12cf0 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
12d00 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12d10 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
12d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12d30 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
12d40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12d50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12d60 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
12d70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
12d80 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
12d90 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
12da0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
12db0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
12dc0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
12dd0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12de0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
12df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12e00 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69   OP_OpenTemp, di
12e10 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65  stinct, 1);.  }e
12e20 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
12e30 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
12e40 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
12e50 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
12e60 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
12e70 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
12e80 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
12e90 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  here, 0, .      
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
12ec0 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
12ed0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
12ee0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
12ef0 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
12f00 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
12f10 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
12f20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
12f30 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
12f40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
12f50 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
12f60 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12f70 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
12f80 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
12f90 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
12fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12fb0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
12fc0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
12fd0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20  pWInfo->iBreak) 
12fe0 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
12ff0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
13000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
13010 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
13020 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
13030 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  en do the specia
13040 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
13050 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
13060 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
13070 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20  AggExpr *pAgg;. 
13080 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
13090 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  ){.      int lbl
130a0 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  1;.      for(i=0
130b0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
130c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
130d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
130e0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
130f0 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
13100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13120 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
13130 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
13140 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13150 65 33 41 64 64 4b 65 79 54 79 70 65 28 76 2c 20  e3AddKeyType(v, 
13160 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
13170 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56   lbl1 = sqlite3V
13180 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
13190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
131a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
131b0 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
131c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
131d0 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41   pAgg=pParse->aA
131e0 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  gg; i<pParse->nA
131f0 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29  gg; i++, pAgg++)
13200 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  {.        if( pA
13210 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
13220 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
13230 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
13240 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70  arse, pAgg->pExp
13250 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13260 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13270 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29  OP_AggSet, 0, i)
13280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13290 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
132a0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29  veLabel(v, lbl1)
132b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
132c0 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
132d0 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
132e0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
132f0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  g++){.      Expr
13300 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20   *pE;.      int 
13310 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e  nExpr;.      Fun
13320 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
13330 20 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41    if( !pAgg->isA
13340 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
13350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
13360 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  g->pFunc!=0 );. 
13370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
13380 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21  g->pFunc->xStep!
13390 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66  =0 );.      pDef
133a0 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a   = pAgg->pFunc;.
133b0 20 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d        pE = pAgg-
133c0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
133d0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
133e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
133f0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
13400 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45  TION );.      nE
13410 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
13420 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
13430 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2c  arse, pE->pList,
13440 20 70 44 65 66 2d 3e 69 6e 63 6c 75 64 65 54 79   pDef->includeTy
13450 70 65 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pes);.      sqli
13460 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13470 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
13480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13490 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
134a0 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c  gFunc, 0, nExpr,
134b0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
134c0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
134d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
134e0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
134f0 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
13500 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
13510 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
13520 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
13530 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
13540 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
13550 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
13560 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
13570 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
13580 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
13590 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
135a0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
135b0 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
135c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
135d0 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
135e0 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
135f0 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  gg = sqlite3Vdbe
13600 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
13610 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  ext, 0, endagg);
13620 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
13630 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Agg = 1;.    if(
13640 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
13650 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13660 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
13670 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
13680 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
13690 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
136a0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
136b0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
136c0 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
136d0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
136e0 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
136f0 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
13700 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
13710 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13720 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
13730 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
13740 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
13750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13760 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13770 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
13780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13790 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
137a0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
137b0 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
137c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
137d0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
137e0 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
137f0 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
13800 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
13810 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
13820 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
13830 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
13840 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
13850 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
13860 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
13870 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
13880 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  m);.  }..  /* If
13890 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
138a0 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
138b0 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
138c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
138d0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
138e0 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65  able.  So delete
138f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74   the subquery st
13900 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
13910 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20   parent.  ** to 
13920 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62  prevent this sub
13930 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
13940 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
13950 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
13960 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  e.  ** the use o
13970 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
13980 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
13990 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
139a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
139b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
139c0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
139d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
139e0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
139f0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
13a00 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13a10 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  tDelete(p);.    
13a20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
13a30 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
13a40 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ect = 0;.  }..  
13a50 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
13a60 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
13a70 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
13a80 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
13a90 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
13aa0 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
13ab0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
13ac0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
13ad0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
13ae0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
13af0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
13b00 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
13b10 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
13b20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
13b30 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  ect_end:.  sqlit
13b40 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
13b50 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72  set(pParse);.  r
13b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a     eturn rc;.}....