/ Hex Artifact Content
Login

Artifact b62bb2507df4bfac45f808ac9de9a2af99b9ff28:


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 35  select.c,v 1.165
0200: 20 32 30 30 34 2f 30 35 2f 31 37 20 31 30 3a 34   2004/05/17 10:4
0210: 38 3a 35 38 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:58 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 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aa30: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
aa40: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
aa50: 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62   eDest = SRT_Tab
aa60: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
aa70: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
aa80: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
aa90: 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
aaa0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ents..  */.  swi
aab0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
aac0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
aad0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
aae0: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
aaf0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69       pPrior->nLi
ab00: 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b  mit = p->nLimit;
ab10: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
ab20: 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f  >nOffset = p->nO
ab30: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
ab40: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ab50: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
ab60: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
ab70: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
ab80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ab90: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d  n rc;.        p-
aba0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
abb0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
abc0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
abd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
abe0: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
abf0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
ac00: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
ac10: 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65         p->nOffse
ac20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
ac30: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ac40: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
ac50: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
ac60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   0);.        p->
ac70: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ac80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
ac90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
aca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
acb0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
acc0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
acd0: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
ace0: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
acf0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
ad00: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
ad10: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
ad20: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
ad30: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
ad40: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
ad50: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
ad60: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
ad70: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
ad80: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ad90: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
ada0: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
adb0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
adc0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
add0: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
ade0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
adf0: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
ae00: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
ae10: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f    int nLimit, nO
ae20: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
ae30: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
ae40: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
ae50: 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  et */.      Expr
ae60: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
ae70: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
ae80: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
ae90: 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a  right SELECT */.
aea0: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
aeb0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
aec0: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
aed0: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
aee0: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
aef0: 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d   && p->pOrderBy=
af00: 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c  =0 && p->nLimit<
af10: 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d  0 && p->nOffset=
af20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
af30: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
af40: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
af50: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
af60: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
af70: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
af80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
af90: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
afa0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
afb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
afc0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
afd0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
afe0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
aff0: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
b000: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
b010: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
b020: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
b030: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
b040: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
b050: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20  ( p->pOrderBy . 
b060: 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f         && matchO
b070: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
b080: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
b090: 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c  derBy, unionTab,
b0a0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
b0b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
b0c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b0d0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29   p->op!=TK_ALL )
b0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b0f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b100: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
b110: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
b120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b130: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
b140: 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c  sData, unionTab,
b150: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
b160: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
b170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b180: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75  , OP_OpenTemp, u
b190: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
b1b0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b1c0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
b1d0: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
b1e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
b1f0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
b200: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
b210: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
b220: 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Tab, 0, 0, 0);. 
b230: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
b240: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
b250: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
b260: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
b270: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
b280: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
b290: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
b2a0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
b2b0: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
b2c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b2d0: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
b2e0: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
b2f0: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
b300: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
b310: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
b320: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
b330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b340: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
b350: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
b360: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
b370: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
b380: 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20  0;.      nLimit 
b390: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  = p->nLimit;.   
b3a0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d     p->nLimit = -
b3b0: 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74  1;.      nOffset
b3c0: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
b3d0: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
b3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
b3f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b400: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
b410: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
b420: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
b430: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
b440: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
b450: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
b460: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69  ->nLimit = nLimi
b470: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66  t;.      p->nOff
b480: 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20  set = nOffset;. 
b490: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
b4a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
b4b0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
b4c0: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
b4d0: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
b4e0: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
b4f0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
b500: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
b510: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
b520: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
b530: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
b540: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
b550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b560: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b570: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
b580: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b590: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
b5a0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
b5b0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
b5c0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
b5d0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
b5e0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
b5f0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
b600: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
b610: 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c   p->pSrc, p->pEL
b620: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
b630: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
b640: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b650: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b660: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
b670: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
b680: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b690: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b6a0: 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
b6b0: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
b6c0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
b6d0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
b6e0: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  e, p);.        i
b6f0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
b700: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b710: 29 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69  );.        multi
b720: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
b730: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  p, p->pOrderBy);
b740: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
b750: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
b760: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
b770: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
b780: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
b7b0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
b7c0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
b7f0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b800: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b810: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 1;.        sql
b820: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b830: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
b840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
b860: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
b870: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
b880: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b890: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
b8a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
b8b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b8c0: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
b8d0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
b8e0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
b900: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
b910: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
b920: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
b930: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rm);.        }. 
b940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
b950: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b960: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
b970: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
b980: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
b990: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
b9a0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
b9b0: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
b9c0: 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  set;..      /* I
b9d0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
b9e0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
b9f0: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
ba00: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
ba10: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
ba20: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
ba30: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
ba40: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
ba50: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
ba60: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
ba70: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
ba80: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
ba90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
baa0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
bab0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
bac0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
bad0: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
bae0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
baf0: 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c  e,p,p->pOrderBy,
bb00: 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20  tab1,1) ){.     
bb10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
bb20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
bb30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bb40: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31  P_OpenTemp, tab1
bb50: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bb60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bb70: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
bb80: 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  b1, 1);..      /
bb90: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
bba0: 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
bbb0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
bbc0: 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
bbd0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
bbe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
bbf0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52  arse, pPrior, SR
bc00: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30  T_Union, tab1, 0
bc10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
bc20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
bc30: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  c;..      /* Cod
bc40: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
bc50: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
bc60: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
bc70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bc80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc90: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
bca0: 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20   tab2, 1);.     
bcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bcc0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
bcd0: 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20  a, tab2, 1);.   
bce0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
bcf0: 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d  ;.      nLimit =
bd00: 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20   p->nLimit;.    
bd10: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
bd20: 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20  ;.      nOffset 
bd30: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
bd40: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
bd50: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
bd60: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
bd70: 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f  rse, p, SRT_Unio
bd80: 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30  n, tab2, 0, 0, 0
bd90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
bda0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
bdb0: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e     p->nLimit = n
bdc0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
bdd0: 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65  nOffset = nOffse
bde0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
bdf0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
be00: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
be10: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
be20: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
be30: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
be40: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
be50: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
be60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
be70: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
be80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
be90: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
bea0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
beb0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
bec0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
bed0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
bee0: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
bef0: 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  p->pSrc, p->pELi
bf00: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
bf10: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
bf20: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
bf30: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
bf40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bf50: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bf60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf70: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
bf80: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
bf90: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
bfa0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
bfb0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53  se, p);.      iS
bfc0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
bfd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75  beAddOp(v, OP_Fu
bfe0: 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b  llKey, tab1, 0);
bff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
c010: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
c020: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74  ont);.      mult
c030: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
c040: 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  (p, p->pOrderBy)
c050: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
c060: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
c070: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
c080: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
c090: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
c0c0: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
c0d0: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
c100: 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ak);.      if( r
c110: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
c120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c130: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
c140: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
c150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c160: 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
c170: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  iStart);.      s
c180: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c190: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
c1a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c1b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1c0: 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
c1d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c1e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
c1f0: 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
c200: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
c210: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
c220: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c230: 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74  (p, v, p->pEList
c240: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
c250: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
c260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c270: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
c280: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
c290: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
c2a0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
c2b0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
c2c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
c2d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c2e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
c2f0: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
c300: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
c310: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
c320: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
c330: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c340: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
c350: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c360: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
c370: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
c380: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
c390: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
c3a0: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
c3b0: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
c3c0: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
c3d0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
c3e0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
c3f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
c400: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
c410: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
c420: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
c430: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
c440: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
c450: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
c460: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
c470: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
c480: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
c490: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
c4a0: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
c4b0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
c4c0: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
c4d0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
c4e0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
c4f0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
c500: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
c510: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
c520: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
c530: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
c540: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c550: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
c560: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
c570: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
c580: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
c590: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
c5a0: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
c5b0: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
c5c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c5d0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
c5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c5f0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
c600: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
c610: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
c620: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
c630: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
c640: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
c650: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
c660: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
c670: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
c680: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
c690: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
c6a0: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
c6b0: 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
c6c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
c6d0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
c6e0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
c6f0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
c700: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
c710: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c720: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
c730: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
c740: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
c750: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c760: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
c770: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
c780: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
c790: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
c7a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
c7b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
c7c0: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
c7d0: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
c7e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
c7f0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 70 45  ew->op;.      pE
c800: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
c810: 70 4e 65 77 2d 3e 64 61 74 61 54 79 70 65 3b 0a  pNew->dataType;.
c820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
c830: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
c840: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
c850: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
c860: 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74  rDup(pNew->pLeft
c870: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c880: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
c890: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
c8a0: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
c8b0: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
c8c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
c8d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
c8e0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
c8f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
c900: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c910: 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  p(pNew->pList);.
c920: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
c930: 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
c940: 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
c950: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
c960: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
c970: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
c980: 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
c990: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
c9a0: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
c9b0: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
c9c0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
c9d0: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70  nCopy(&pExpr->sp
c9e0: 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
c9f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
ca00: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
ca10: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
ca20: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
ca30: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
ca40: 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
ca50: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
ca60: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
ca70: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
ca80: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
ca90: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a  .}.static void .
caa0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
cab0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
cac0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
cad0: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
cae0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
caf0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
cb00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
cb10: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
cb20: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
cb30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cb40: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
cb50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
cb60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
cb70: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
cb80: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
cb90: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
cba0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
cbb0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
cbc0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
cbd0: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
cbe0: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
cbf0: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
cc00: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
cc10: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
cc20: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
cc30: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
cc40: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
cc50: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
cc60: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
cc70: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
cc80: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
cc90: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
cca0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
ccb0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
ccc0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
ccd0: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
cce0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
ccf0: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
cd00: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
cd10: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
cd20: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
cd30: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
cd40: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
cd50: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
cd60: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
cd70: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
cd80: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
cd90: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
cda0: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
cdb0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
cdc0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
cdd0: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
cde0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
cdf0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
ce00: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
ce10: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
ce20: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
ce30: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
ce40: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
ce50: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
ce60: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
ce70: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
ce80: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
ce90: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
cea0: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
ceb0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
cec0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
ced0: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
cee0: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
cef0: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
cf00: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
cf10: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
cf20: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
cf30: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
cf40: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
cf50: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
cf60: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
cf70: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
cf80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
cf90: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
cfa0: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
cfb0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
cfc0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
cfd0: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
cfe0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
cff0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d000: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
d010: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
d020: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
d030: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
d040: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d050: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
d060: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
d070: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
d080: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
d090: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
d0a0: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
d0b0: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
d0c0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
d0d0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
d0e0: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
d0f0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
d100: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
d110: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
d120: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
d130: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
d140: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
d150: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
d160: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
d170: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
d180: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
d190: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
d1a0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
d1b0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
d1c0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
d1d0: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
d1e0: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
d1f0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
d200: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
d210: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
d220: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
d230: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
d240: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
d250: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d260: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
d270: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
d280: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d290: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
d2a0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
d2b0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
d2c0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
d2d0: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
d2e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
d2f0: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
d300: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
d310: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
d320: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
d330: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
d340: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
d350: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
d360: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
d370: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
d380: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
d390: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
d3a0: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
d3b0: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
d3c0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
d3d0: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
d3e0: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
d3f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
d400: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
d410: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
d420: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
d430: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
d440: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
d450: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
d460: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
d470: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
d480: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
d490: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
d4a0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
d4b0: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
d4c0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
d4d0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
d4e0: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
d4f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
d500: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
d510: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
d520: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
d530: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
d540: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
d550: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
d560: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
d570: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
d580: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
d590: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
d5a0: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
d5b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
d5c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d5d0: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
d5e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d5f0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
d600: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d610: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
d620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d630: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
d640: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d650: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
d660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
d670: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
d680: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
d690: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
d6a0: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
d6b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
d6c0: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
d6d0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d6e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
d6f0: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
d700: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
d710: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
d720: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
d730: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
d740: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
d750: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
d760: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
d770: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
d780: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
d790: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
d7a0: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
d7b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
d7c0: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
d7d0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
d7e0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
d7f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
d800: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
d810: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
d820: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
d830: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
d840: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
d850: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
d860: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
d870: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
d880: 69 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  i;.  Expr *pWher
d890: 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
d8a0: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
d8b0: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
d8c0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
d8d0: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
d8e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d8f0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
d900: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
d910: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
d920: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
d930: 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72   );.  pSub = pSr
d940: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c  c->a[iFrom].pSel
d950: 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
d960: 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
d970: 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
d980: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
d990: 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  0;.  if( subquer
d9a0: 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
d9b0: 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
d9c0: 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  0;.  pSubSrc = p
d9d0: 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
d9e0: 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
d9f0: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
da00: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
da10: 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  0;.  if( (pSub->
da20: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
da30: 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26  ub->nLimit>=0) &
da40: 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  &  (pSrc->nSrc>1
da50: 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
da60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
da70: 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73  .  if( (p->isDis
da80: 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d  tinct || p->nLim
da90: 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65  it>=0) && subque
daa0: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
dab0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   0;.  if( p->pOr
dac0: 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
dad0: 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
dae0: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69   0;..  /* Restri
daf0: 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
db00: 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
db10: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
db20: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
db30: 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
db40: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
db50: 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
db60: 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
db70: 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
db80: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
db90: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
dba0: 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
dbb0: 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
dbc0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
dbd0: 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
dbe0: 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
dbf0: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
dc00: 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
dc10: 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
dc20: 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
dc30: 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
dc40: 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
dc50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
dc60: 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
dc70: 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
dc80: 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
dc90: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
dca0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
dcb0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
dcc0: 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
dcd0: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
dce0: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
dcf0: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
dd00: 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
dd10: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
dd20: 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
dd30: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
dd40: 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
dd50: 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
dd60: 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
dd70: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
dd80: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
dd90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
dda0: 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
ddb0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
ddc0: 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
ddd0: 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
dde0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
ddf0: 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
de00: 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
de10: 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
de20: 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
de30: 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
de40: 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
de50: 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
de60: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
de70: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
de80: 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
de90: 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
dea0: 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20  /.  if( iFrom>0 
deb0: 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
dec0: 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
ded0: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
dee0: 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68      && pSub->pWh
def0: 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ere!=0 ){.    re
df00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
df10: 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
df20: 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
df30: 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  ns flattening is
df40: 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
df50: 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68  he.  ** iFrom-th
df60: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
df70: 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
df80: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
df90: 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  */..  /* Move al
dfa0: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
dfb0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
dfc0: 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
dfd0: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
dfe0: 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
dff0: 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
e000: 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
e010: 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
e020: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
e030: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
e040: 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
e050: 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
e060: 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
e070: 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
e080: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
e090: 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
e0a0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
e0b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
e0c0: 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
e0d0: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
e0e0: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
e0f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
e100: 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
e110: 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
e120: 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
e130: 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
e140: 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
e150: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72   in..  */.  iPar
e160: 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  ent = pSrc->a[iF
e170: 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
e180: 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
e190: 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
e1a0: 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
e1b0: 79 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  ype = pSrc->a[iF
e1c0: 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a  rom].jointype;..
e1d0: 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
e1e0: 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70  iFrom].pTab && p
e1f0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
e200: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
e210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e220: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
e230: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
e240: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
e250: 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e  qliteFree(pSrc->
e260: 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61  a[iFrom].zDataba
e270: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
e280: 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  ree(pSrc->a[iFro
e290: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m].zName);.    s
e2a0: 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e  qliteFree(pSrc->
e2b0: 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29  a[iFrom].zAlias)
e2c0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  ;.    if( nSubSr
e2d0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  c>1 ){.      int
e2e0: 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63   extra = nSubSrc
e2f0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   - 1;.      for(
e300: 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=1; i<nSubSrc; 
e310: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
e320: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
e330: 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20  istAppend(pSrc, 
e340: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
e350: 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70       p->pSrc = p
e360: 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
e370: 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
e380: 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69  -extra>=iFrom; i
e390: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  --){.        pSr
e3a0: 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e  c->a[i] = pSrc->
e3b0: 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20  a[i-extra];.    
e3c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
e3d0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
e3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; i++){.      pS
e3f0: 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
e400: 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
e410: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
e420: 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
e430: 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
e440: 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
e450: 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b    pSrc->a[iFrom+
e460: 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  nSubSrc-1].joint
e470: 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
e480: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65    }..  /* Now be
e490: 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
e4a0: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
e4b0: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
e4c0: 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72   for .  ** refer
e4d0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
e4e0: 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
e4f0: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20  r query..  ** . 
e500: 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
e510: 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20  *.  **   SELECT 
e520: 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
e530: 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
e540: 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
e550: 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
e560: 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
e570: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
e580: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
e590: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
e5a0: 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20           /.  ** 
e5b0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
e5c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
e5d0: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
e5e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e5f0: 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ____/.  **.  ** 
e600: 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
e610: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
e620: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
e630: 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
e640: 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77  e see.  ** "a" w
e650: 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
e660: 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
e670: 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
e680: 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
e690: 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74  0"..  */.  subst
e6a0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
e6b0: 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
e6c0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c  b->pEList);.  pL
e6d0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
e6e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e6f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e700: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
e710: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
e720: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
e730: 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
e740: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
e750: 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
e760: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
e770: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
e780: 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e  NDup(pExpr->span
e790: 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
e7a0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
e7b0: 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
e7c0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
e7d0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
e7e0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e7f0: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
e800: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
e810: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
e820: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
e830: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
e840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e850: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
e860: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
e870: 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
e880: 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
e890: 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
e8a0: 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
e8b0: 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
e8c0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
e8d0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
e8e0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
e8f0: 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
e900: 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
e910: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e920: 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
e930: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
e940: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
e950: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
e960: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
e970: 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
e980: 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
e990: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
e9a0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
e9b0: 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
e9c0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
e9d0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e9e0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
e9f0: 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b  pSub->pHaving ){
ea00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61  .      Expr *pHa
ea10: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
ea20: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76  prDup(pSub->pHav
ea30: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
ea40: 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
ea50: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
ea60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
ea70: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e  K_AND, p->pHavin
ea80: 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a  g, pHaving, 0);.
ea90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eaa0: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
eab0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20  = pHaving;.     
eac0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
ead0: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
eae0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
eaf0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
eb00: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
eb10: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
eb20: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
eb30: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
eb40: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
eb50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
eb60: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
eb70: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
eb80: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
eb90: 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
eba0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
ebb0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e  qlite3Expr(TK_AN
ebc0: 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  D, p->pWhere, pW
ebd0: 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  here, 0);.    }.
ebe0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c    }..  /* The fl
ebf0: 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
ec00: 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
ec10: 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
ec20: 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20   the.  ** outer 
ec30: 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
ec40: 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73  t. .  */.  p->is
ec50: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
ec60: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
ec70: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
ec80: 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
ec90: 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
eca0: 6e 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  n from the subqu
ecb0: 65 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ery to the outer
ecc0: 0a 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a  .  ** query..  *
ecd0: 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c  /.  if( pSub->nL
ece0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
ecf0: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29  f( p->nLimit<0 )
ed00: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
ed10: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
ed20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed30: 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66  p->nLimit+p->nOf
ed40: 66 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69  fset > pSub->nLi
ed50: 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65  mit+pSub->nOffse
ed60: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  t ){.      p->nL
ed70: 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69  imit = pSub->nLi
ed80: 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66  mit + pSub->nOff
ed90: 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74  set - p->nOffset
eda0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
edb0: 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62  >nOffset += pSub
edc0: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  ->nOffset;..  /*
edd0: 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
ede0: 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
edf0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
ee00: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
ee10: 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
ee20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
ee30: 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
ee40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
ee50: 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
ee60: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
ee70: 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75  ed in as an argu
ee80: 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
ee90: 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65  t.** is a simple
eea0: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
eeb0: 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73  query.  If it is
eec0: 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20   and this query 
eed0: 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66  can be.** satisf
eee0: 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ied using a sing
eef0: 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62  le seek to the b
ef00: 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20  eginning or end 
ef10: 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  of an index,.** 
ef20: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68  then generate th
ef30: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  e code for this 
ef40: 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72  SELECT and retur
ef50: 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73  n 1.  If this is
ef60: 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c   not a .** simpl
ef70: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
ef80: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74   query, then ret
ef90: 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  urn 0;.**.** A s
efa0: 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d  imply min() or m
efb0: 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73  ax() query looks
efc0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
efd0: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  *    SELECT min(
efe0: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
eff0: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  *    SELECT max(
f000: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
f010: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d  *.** The query m
f020: 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ay have only a s
f030: 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69  ingle table in i
f040: 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74  ts FROM argument
f050: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20  .  There.** can 
f060: 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f  be no GROUP BY o
f070: 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52  r HAVING or WHER
f080: 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  E clauses.  The 
f090: 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a  result set must.
f0a0: 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20  ** be the min() 
f0b0: 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69  or max() of a si
f0c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ngle column of t
f0d0: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
f0e0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  olumn.** in the 
f0f0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
f100: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
f110: 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  indexed..**.** T
f120: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
f130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
f140: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f  e the same as fo
f150: 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
f160: 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65  )..** See the he
f170: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
f180: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
f190: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f1a0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
f1b0: 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
f1c0: 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
f1d0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f1e0: 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  p, int eDest, in
f1f0: 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72  t iParm){.  Expr
f200: 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69   *pExpr;.  int i
f210: 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Col;.  Table *pT
f220: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
f230: 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  x;.  int base;. 
f240: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
f250: 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f  seekOp;.  int co
f260: 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  nt;.  ExprList *
f270: 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20  pEList, *pList, 
f280: 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  eList;.  struct 
f290: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c  ExprList_item eL
f2a0: 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69  istItem;.  SrcLi
f2b0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 0a 0a 20 20  st *pSrc;.  ..  
f2c0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
f2d0: 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
f2e0: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
f2f0: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
f300: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
f310: 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
f320: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
f330: 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
f340: 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
f350: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
f360: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
f370: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
f380: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
f390: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
f3a0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
f3b0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
f3d0: 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
f3e0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
f3f0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
f400: 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
f410: 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
f420: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
f430: 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
f440: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
f450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f460: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
f470: 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
f480: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
f490: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
f4a0: 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
f4b0: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
f4c0: 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
f4d0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
f4e0: 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
f4f0: 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
f500: 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
f510: 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
f520: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
f530: 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
f540: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
f550: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
f560: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
f570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
f580: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
f590: 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
f5a0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
f5b0: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
f5c0: 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
f5d0: 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
f5e0: 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
f5f0: 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
f600: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
f610: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
f620: 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
f630: 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
f640: 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
f650: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
f660: 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
f670: 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
f680: 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
f690: 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
f6a0: 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
f6b0: 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
f6c0: 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
f6d0: 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
f6e0: 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
f6f0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
f700: 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
f710: 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
f720: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f730: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f740: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
f750: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f760: 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
f770: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
f780: 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61  [0]==iCol ) brea
f790: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f7a0: 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
f7b0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
f7c0: 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
f7d0: 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
f7e0: 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
f7f0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
f800: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
f810: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
f820: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
f830: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
f840: 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
f850: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
f860: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
f870: 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
f880: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
f890: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
f8a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f8b0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
f8c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f8d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
f8e0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
f8f0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
f900: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c  pParse, p->pSrc,
f910: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d   p->pEList);.  }
f920: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
f930: 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
f940: 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
f950: 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
f960: 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
f970: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
f980: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
f990: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f9a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
f9b0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a   iParm, 0);.  }.
f9c0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
f9d0: 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
f9e0: 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
f9f0: 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
fa00: 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
fa10: 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
fa20: 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
fa30: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
fa40: 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
fa50: 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
fa60: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
fa70: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
fa80: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
fa90: 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
faa0: 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
fab0: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
fac0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
fad0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
fae0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
faf0: 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53  Db);.  base = pS
fb00: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
fb10: 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
fb20: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
fb30: 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72 63  , p);.  if( pSrc
fb40: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
fb50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fb60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fb70: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
fb80: 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
fb90: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
fba0: 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c  _OpenRead, base,
fbb0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
fbc0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
fbd0: 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  }.  cont = sqlit
fbe0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
fbf0: 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  v);.  if( pIdx==
fc00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fc10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
fc20: 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
fc30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
fc40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fc50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
fc60: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
fc70: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
fc80: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61   OP_OpenRead, ba
fc90: 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  se+1, pIdx->tnum
fca0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
fcb0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
fcc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fcd0: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
fce0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fcf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fd00: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
fd10: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
fd20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fd30: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
fd40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fd50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fd60: 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30  _MoveTo, base, 0
fd70: 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
fd80: 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
fd90: 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
fda0: 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
fdb0: 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
fdc0: 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
fdd0: 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
fde0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
fdf0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
fe00: 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
fe10: 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
fe20: 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
fe30: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
fe40: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fe50: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
fe60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fe70: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
fe80: 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
fe90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   1;.}../*.** Gen
fea0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
feb0: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
fec0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
fed0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
fee0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
fef0: 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
ff00: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
ff10: 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
ff20: 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
ff30: 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
ff40: 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
ff50: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
ff60: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
ff70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff90: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
ffa0: 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
ffb0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
ffc0: 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
ffd0: 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
ffe0: 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
fff0: 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
10000 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
10010 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
10020 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
10030 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
10040 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
10050 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
10060 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
10070 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
10080 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
10090 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
100a0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
100b0 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
100c0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
100d0 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
100e0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
100f0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
10100 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
10110 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
10120 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
10130 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10140 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
10150 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
10160 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
10170 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
10180 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
10190 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
101a0 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
101b0 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
101c0 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
101d0 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
101e0 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
101f0 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
10200 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
10210 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10220 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
10230 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
10240 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
10250 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
10260 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
10270 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
10280 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
10290 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
102a0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
102b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
102c0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
102d0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
102e0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
102f0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
10300 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
10310 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
10320 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
10330 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
10340 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
10350 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
10360 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
10370 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
10380 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
10390 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
103a0 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
103b0 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
103c0 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
103d0 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
103e0 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
103f0 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
10400 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
10410 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
10420 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
10430 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
10440 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
10450 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
10460 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
10470 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
10480 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
10490 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
104a0 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
104b0 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
104c0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
104d0 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
104e0 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
104f0 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
10500 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
10530 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
10540 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
10590 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
105a0 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
105b0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
105c0 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
105d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
105e0 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
105f0 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
10600 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
10610 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
10620 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
10630 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
10640 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
10650 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
10660 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
10670 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
10680 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
10690 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
106a0 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
106b0 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
106c0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
106d0 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
106e0 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
106f0 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
10700 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
10710 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
10720 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
10730 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
10740 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
10750 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
10760 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
10770 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
10780 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10790 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
107a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
107b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
107c0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
107d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
107e0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
107f0 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
10800 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
10810 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
10820 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
10830 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
10840 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
10850 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
10860 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
10870 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
10880 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
10890 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
108a0 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
108b0 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
108c0 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
108d0 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
108e0 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
108f0 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
10900 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
10910 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20  arentAgg        
10920 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
10930 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
10940 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
10950 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
10960 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
10970 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
10980 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20   isAgg = 0;     
10990 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
109a0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
109b0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
109c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
109d0 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
109e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
109f0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
10a00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
10a10 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
10a20 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
10a30 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
10a40 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
10a50 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
10a60 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
10a70 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
10a80 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
10a90 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
10aa0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
10ab0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
10ac0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
10ad0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
10ae0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
10af0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
10b00 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
10b10 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
10b20 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
10b30 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
10b40 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
10b50 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
10b60 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
10b70 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
10b80 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
10b90 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
10ba0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
10bb0 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
10bc0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
10be0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
10bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
10c00 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
10c10 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
10c20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10c30 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
10c40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
10c50 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10c60 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
10c70 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
10c80 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  n 1;..  /* If th
10c90 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
10ca0 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
10cb0 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
10cc0 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
10cd0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
10ce0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
10cf0 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
10d00 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
10d10 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  arm);.  }..  /* 
10d20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
10d30 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
10d40 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
10d50 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
10d60 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
10d70 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
10d80 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  ere;.  pOrderBy 
10d90 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
10da0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
10db0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
10dc0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
10dd0 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
10de0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  p->isDistinct;..
10df0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56 44    /* Allocate VD
10e00 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20 65  BE cursors for e
10e10 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
10e20 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
10e30 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
10e40 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
10e50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10e60 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  );..  /* .  ** D
10e70 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
10e80 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
10e90 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
10ea0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
10eb0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
10ec0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
10ed0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
10ee0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
10ef0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
10f00 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e  end;..  /* Expan
10f10 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20  d any "*" terms 
10f20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
10f30 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65  t.  (For example
10f40 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a   the "*" in.  **
10f50 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
10f60 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e  t1")  The fillIn
10f70 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75  Columnlist() rou
10f80 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73  tine also does s
10f90 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  ome.  ** other h
10fa0 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65  ousekeeping - se
10fb0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
10fc0 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73  ment for details
10fd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c  ..  */.  if( fil
10fe0 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
10ff0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
11000 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11010 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20  .  }.  pWhere = 
11020 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c  p->pWhere;.  pEL
11030 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
11040 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
11050 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
11060 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
11070 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
11080 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
11090 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
110a0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
110b0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
110c0 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
110d0 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
110e0 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
110f0 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
11100 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11110 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
11120 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
11130 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
11140 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
11150 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
11160 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
11170 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
11180 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
11190 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
111a0 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
111b0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
111c0 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
111d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
111e0 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
111f0 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
11200 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
11210 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
11220 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
11230 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
11240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11250 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
11260 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64  point, we should
11270 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20   have allocated 
11280 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20  all the cursors 
11290 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65  that we.  ** nee
112a0 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71  d to handle subq
112b0 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72  uerys and tempor
112c0 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20  ary tables.  .  
112d0 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20  **.  ** Resolve 
112e0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
112f0 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74   and do a semant
11300 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c  ics check on all
11310 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
11320 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
11330 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
11340 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
11350 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11360 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11370 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69  TabList, 0, pELi
11380 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
11390 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
113a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
113b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
113c0 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
113d0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
113e0 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20  xpr, 1, &isAgg) 
113f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
11400 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
11410 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
11420 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
11430 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
11440 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
11450 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65  st, pEList, pWhe
11460 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  re) ){.      got
11470 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11480 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11490 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
114a0 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
114b0 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
114c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
114d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
114e0 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
114f0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
11500 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11510 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
11520 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
11530 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
11540 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
11550 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11560 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
11570 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
11580 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
11590 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
115a0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
115b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
115c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
115d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
115e0 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76  eck(pParse, pHav
115f0 69 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20  ing, 1, &isAgg) 
11600 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
11610 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
11620 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72    }.  if( pOrder
11630 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
11640 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
11650 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11660 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
11670 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
11680 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
11690 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
116a0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
116b0 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20  r(pE, &iCol) && 
116c0 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
116d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
116e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
116f0 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
11700 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
11710 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
11720 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
11730 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
11740 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
11750 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
11760 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
11770 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
11780 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
11790 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
117a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
117b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
117c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
117d0 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
117e0 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
117f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11800 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11810 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11820 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
11830 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11840 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11850 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d  ger(pE, &iCol)==
11860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
11870 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11880 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11890 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
118a0 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
118b0 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
118c0 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
118d0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
118e0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
118f0 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
11900 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
11910 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
11920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11930 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
11940 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
11950 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
11960 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
11970 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
11980 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
11990 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43  en 1 and %d", iC
119a0 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
119b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  r);.          go
119c0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
119d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
119e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
119f0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
11a00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
11a10 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
11a20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
11a30 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
11a40 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
11a50 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
11a60 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
11a70 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
11a80 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
11a90 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
11aa0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
11ab0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
11ac0 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
11ad0 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
11ae0 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
11af0 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  e3ExprDup(pEList
11b00 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
11b10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11b30 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
11b40 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
11b50 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
11b60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11b70 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
11b80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11b90 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
11ba0 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
11bb0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
11bc0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11bd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
11be0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
11bf0 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
11c00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11c10 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11c20 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol)==0 ){.    
11c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11c40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
11c50 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
11c60 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
11c70 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
11c80 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
11c90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
11ca0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
11cc0 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
11cd0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11cf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11d00 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
11d10 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  UP BY column num
11d20 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
11d30 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
11d40 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
11d50 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
11d60 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
11d70 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
11d80 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11d90 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
11da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11db0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
11dc0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
11dd0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
11de0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11df0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
11e00 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
11e10 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
11e20 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
11e30 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
11e40 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
11e50 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
11e60 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
11e70 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
11e80 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
11e90 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
11ea0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
11eb0 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
11ec0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
11ed0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11ee0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11ef0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  t);.  }..  /* Ge
11f00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
11f10 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
11f20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
11f30 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  se.  */.  for(i=
11f40 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
11f50 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
11f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
11f70 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
11f80 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
11f90 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69  eContext;..    i
11fa0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
11fb0 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
11fc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
11fd0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
11fe0 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
11ff0 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
12000 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
12010 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
12020 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
12030 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73  ontext = pTabLis
12040 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
12050 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
12060 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
12070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
12080 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12090 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
120a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
120b0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
120c0 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
120d0 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20  T_TempTable, .  
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
120f0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
12100 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
12110 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  Agg);.    if( ne
12120 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
12130 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
12140 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
12150 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
12160 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  xt;.    }.    pT
12170 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
12180 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
12190 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66  ->pWhere;.    if
121a0 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55 6e 69  ( eDest!=SRT_Uni
121b0 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  on && eDest!=SRT
121c0 5f 45 78 63 65 70 74 20 26 26 20 65 44 65 73 74  _Except && eDest
121d0 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b  !=SRT_Discard ){
121e0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
121f0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
12200 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
12210 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
12220 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
12230 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
12240 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
12250 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a  sDistinct;.  }..
12260 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
12270 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
12280 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  of a min() or ma
12290 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20  x() function by 
122a0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74  itself.  ** in t
122b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
122c0 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65   */.  if( simple
122d0 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  MinMaxQuery(pPar
122e0 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
122f0 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  arm) ){.    rc =
12300 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   0;.    goto sel
12310 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
12320 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
12330 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62  if this is a sub
12340 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62  query that can b
12350 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e  e "flattened" in
12360 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20  to its parent.. 
12370 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e   ** If flattenin
12380 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74  g is a possiblit
12390 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74  y, do so and ret
123a0 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
123b0 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50    .  */.  if( pP
123c0 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74  arent && pParent
123d0 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61  Agg &&.      fla
123e0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
123f0 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61  rse, pParent, pa
12400 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e  rentTab, *pParen
12410 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a  tAgg, isAgg) ){.
12420 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
12430 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b  *pParentAgg = 1;
12440 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12450 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
12460 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
12470 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
12480 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
12490 70 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  p);..  /* Identi
124a0 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
124b0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
124c0 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20  ing a callback. 
124d0 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
124e0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
124f0 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
12500 67 20 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  g to a destinati
12510 6f 6e 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  on other.  ** th
12520 61 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  an a callback.. 
12530 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 68 61 76 65   **.  ** We have
12540 20 74 6f 20 64 6f 20 74 68 69 73 20 73 65 70 61   to do this sepa
12550 72 61 74 65 6c 79 20 66 72 6f 6d 20 74 68 65 20  rately from the 
12560 63 72 65 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75  creation of colu
12570 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 62  mn names.  ** ab
12580 6f 76 65 20 62 65 63 61 75 73 65 20 69 66 20 74  ove because if t
12590 68 65 20 70 54 61 62 4c 69 73 74 20 63 6f 6e 74  he pTabList cont
125a0 61 69 6e 73 20 76 69 65 77 73 20 74 68 65 6e 20  ains views then 
125b0 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  they will not.  
125c0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  ** have been res
125d0 6f 6c 76 65 64 20 61 6e 64 20 77 65 20 77 69 6c  olved and we wil
125e0 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 63  l not know the c
125f0 6f 6c 75 6d 6e 20 74 79 70 65 73 20 75 6e 74 69  olumn types unti
12600 6c 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  l.  ** now..  */
12610 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12620 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
12630 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
12640 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
12650 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
12660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12670 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
12680 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
12690 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
126a0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
126b0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
126c0 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
126d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
126e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
126f0 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
12700 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20    }..  /* Do an 
12710 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72  analysis of aggr
12720 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  egate expression
12730 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
12740 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
12750 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  et(pParse);.  if
12760 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
12770 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBy ){.    asser
12780 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d  t( pParse->nAgg=
12790 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20  =0 );.    isAgg 
127a0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
127b0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
127c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
127d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
127e0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
127f0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
12800 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
12810 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12820 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
12830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
12840 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
12850 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
12860 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
12870 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
12880 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
12890 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
128a0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
128b0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
128c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
128d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
128e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
128f0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
12900 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
12910 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12920 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
12930 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12940 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12950 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
12960 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
12970 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
12980 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12990 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
129a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
129b0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
129c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
129d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
129e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
129f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12a00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12a10 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  /* Reset the agg
12a20 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69  regator.  */.  i
12a30 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
12a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a50 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c  (v, OP_AggReset,
12a60 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67   0, pParse->nAgg
12a70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
12a80 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
12a90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  i++){.      Func
12aa0 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  Def *pFunc;.    
12ab0 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70    if( (pFunc = p
12ac0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
12ad0 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e  Func)!=0 && pFun
12ae0 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  c->xFinalize!=0 
12af0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12b00 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
12b10 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28  AggInit, 0, i, (
12b20 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f  char*)pFunc, P3_
12b30 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20  POINTER);.      
12b40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12b50 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
12b60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12b70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
12b80 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
12b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ba0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
12bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
12bc0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
12bd0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
12be0 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
12bf0 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12c00 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
12c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12c20 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
12c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12c40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12c50 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
12c60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
12c70 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
12c80 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
12c90 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
12ca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
12cb0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
12cc0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12cd0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
12ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12cf0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69   OP_OpenTemp, di
12d00 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65  stinct, 1);.  }e
12d10 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
12d20 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
12d30 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
12d40 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
12d50 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
12d60 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
12d70 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
12d80 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  here, 0, .      
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
12db0 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
12dc0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
12dd0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
12de0 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
12df0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
12e00 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
12e10 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
12e20 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
12e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
12e40 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
12e50 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12e60 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
12e70 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
12e80 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
12e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12ea0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
12eb0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
12ec0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20  pWInfo->iBreak) 
12ed0 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
12ee0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
12ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
12f00 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
12f10 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
12f20 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  en do the specia
12f30 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
12f40 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
12f50 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
12f60 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20  AggExpr *pAgg;. 
12f70 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
12f80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  ){.      int lbl
12f90 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  1;.      for(i=0
12fa0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
12fb0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
12fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12fd0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
12fe0 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
12ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
13020 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
13030 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13040 65 33 41 64 64 4b 65 79 54 79 70 65 28 76 2c 20  e3AddKeyType(v, 
13050 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
13060 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56   lbl1 = sqlite3V
13070 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
13080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13090 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
130a0 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
130b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
130c0 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41   pAgg=pParse->aA
130d0 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  gg; i<pParse->nA
130e0 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29  gg; i++, pAgg++)
130f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  {.        if( pA
13100 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
13110 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
13120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
13130 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70  arse, pAgg->pExp
13140 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13150 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13160 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29  OP_AggSet, 0, i)
13170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13180 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13190 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29  veLabel(v, lbl1)
131a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
131b0 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
131c0 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
131d0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
131e0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  g++){.      Expr
131f0 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20   *pE;.      int 
13200 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 46 75 6e  nExpr;.      Fun
13210 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
13220 20 20 69 66 28 20 21 70 41 67 67 2d 3e 69 73 41    if( !pAgg->isA
13230 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
13240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
13250 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  g->pFunc!=0 );. 
13260 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67       assert( pAg
13270 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21  g->pFunc->xStep!
13280 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 66  =0 );.      pDef
13290 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a   = pAgg->pFunc;.
132a0 20 20 20 20 20 20 70 45 20 3d 20 70 41 67 67 2d        pE = pAgg-
132b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
132c0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
132d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
132e0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
132f0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45  TION );.      nE
13300 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
13310 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
13320 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2c  arse, pE->pList,
13330 20 70 44 65 66 2d 3e 69 6e 63 6c 75 64 65 54 79   pDef->includeTy
13340 70 65 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pes);.      sqli
13350 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13360 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
13370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13380 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
13390 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c  gFunc, 0, nExpr,
133a0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
133b0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
133c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
133d0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
133e0 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
133f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
13400 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
13410 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
13420 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
13430 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
13440 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
13450 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
13460 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
13470 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
13480 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
13490 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
134a0 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
134b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
134c0 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
134d0 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
134e0 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  gg = sqlite3Vdbe
134f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
13500 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  ext, 0, endagg);
13510 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
13520 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Agg = 1;.    if(
13530 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
13540 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13550 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
13560 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
13570 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
13580 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
13590 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
135a0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
135b0 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
135c0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
135d0 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
135e0 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
135f0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
13600 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13610 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
13620 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
13630 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
13640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13650 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13660 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
13670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13680 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
13690 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
136a0 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
136b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
136c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
136d0 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
136e0 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
136f0 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
13700 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
13710 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
13720 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
13730 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
13740 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
13750 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
13760 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
13770 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  m);.  }..  /* If
13780 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
13790 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
137a0 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
137b0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
137c0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
137d0 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65  able.  So delete
137e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74   the subquery st
137f0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
13800 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20   parent.  ** to 
13810 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62  prevent this sub
13820 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
13830 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
13840 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
13850 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  e.  ** the use o
13860 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
13870 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
13880 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
13890 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
138a0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
138b0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
138c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
138d0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
138e0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
138f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13900 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  tDelete(p);.    
13910 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
13920 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
13930 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ect = 0;.  }..  
13940 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
13950 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
13960 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
13970 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
13980 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
13990 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
139a0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
139b0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
139c0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
139d0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
139e0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
139f0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
13a00 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
13a10 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
13a20 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  ect_end:.  sqlit
13a30 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
13a40 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72  set(pParse);.  r
13a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a     eturn rc;.}....