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

Artifact 9290439282fdc787fdf34d8600dec3a360275c92:


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 33  select.c,v 1.163
0200: 20 32 30 30 34 2f 30 35 2f 31 30 20 31 30 3a 33   2004/05/10 10:3
0210: 34 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  4:49 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 20 69 66 28  M;.    }else if(
2670: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
2680: 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
2690: 20 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69       type = sqli
26a0: 74 65 33 45 78 70 72 54 79 70 65 28 70 4f 72 64  te3ExprType(pOrd
26b0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
26c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26d0: 20 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54      type = SQLIT
26e0: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 0a  E_SO_NUM;.    }.
26f0: 20 20 20 20 69 66 28 20 28 6f 72 64 65 72 20 26      if( (order &
2700: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49 52 4d 41   SQLITE_SO_DIRMA
2710: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  SK)==SQLITE_SO_A
2720: 53 43 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  SC ){.      c = 
2730: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  type==SQLITE_SO_
2740: 54 45 58 54 20 3f 20 27 41 27 20 3a 20 27 2b 27  TEXT ? 'A' : '+'
2750: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2760: 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c     c = type==SQL
2770: 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 44  ITE_SO_TEXT ? 'D
2780: 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 7d 0a 20  ' : '-';.    }. 
2790: 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d     zSortOrder[i]
27a0: 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74 65   = c;.    sqlite
27b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
27c0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
27d0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a  .pExpr);.  }.  z
27e0: 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72  SortOrder[pOrder
27f0: 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a  By->nExpr] = 0;.
2800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
2810: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b  (v, OP_SortMakeK
2820: 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ey, pOrderBy->nE
2830: 78 70 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64  xpr, 0, zSortOrd
2840: 65 72 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  er, P3_DYNAMIC);
2850: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2860: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75  dOp(v, OP_SortPu
2870: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
2880: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2890: 61 64 64 73 20 61 20 50 33 20 61 72 67 75 6d 65  adds a P3 argume
28a0: 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 56  nt to the last V
28b0: 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61 74 20  DBE opcode that 
28c0: 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e  was.** inserted.
28d0: 20 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e 74   The P3 argument
28e0: 20 61 64 64 65 64 20 69 73 20 61 20 73 74 72 69   added is a stri
28f0: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
2900: 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b  the .** OP_MakeK
2910: 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49 64 78  ey or OP_MakeIdx
2920: 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20 54 68  Key opcodes.  Th
2930: 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  e string consist
2940: 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  s of.** characte
2950: 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20 64 65  rs 't' or 'n' de
2960: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
2970: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76 61  er or not the va
2980: 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64 73 20  rious.** fields 
2990: 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20 62 65  of the key to be
29a0: 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f 75 6c   generated shoul
29b0: 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  d be treated as 
29c0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20 61 73  numeric.** or as
29d0: 20 74 65 78 74 2e 20 20 53 65 65 20 74 68 65 20   text.  See the 
29e0: 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64 20 4f  OP_MakeKey and O
29f0: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63  P_MakeIdxKey opc
2a00: 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61  ode.** documenta
2a10: 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
2a20: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
2a30: 61 62 6f 75 74 20 74 68 65 20 50 33 20 73 74 72  about the P3 str
2a40: 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ing..** See also
2a50: 20 74 68 65 20 73 71 6c 69 74 65 33 41 64 64 49   the sqlite3AddI
2a60: 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74  dxKeyType() rout
2a70: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
2a80: 69 74 65 33 41 64 64 4b 65 79 54 79 70 65 28 56  ite3AddKeyType(V
2a90: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
2aa0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
2ab0: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
2ac0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72  t->nExpr;.  char
2ad0: 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65   *zType = sqlite
2ae0: 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b  Malloc( nColumn+
2af0: 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  1 );.  int i;.  
2b00: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72  if( zType==0 ) r
2b10: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
2b20: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2b30: 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  ){.    zType[i] 
2b40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 79 70  = sqlite3ExprTyp
2b50: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
2b60: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
2b70: 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27  _NUM ? 'n' : 't'
2b80: 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d  ;.  }.  zType[i]
2b90: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56   = 0;.  sqlite3V
2ba0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
2bb0: 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 44 59 4e  1, zType, P3_DYN
2bc0: 41 4d 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  AMIC);.}../*.** 
2bd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2be0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
2bf0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
2c00: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
2c10: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
2c20: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
2c30: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
2c40: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
2c50: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
2c60: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
2c70: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
2c80: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
2c90: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
2ca0: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
2cb0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
2cc0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
2cd0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
2ce0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
2cf0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
2d00: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
2d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d20: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
2d30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2d40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2d50: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2d60: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d80: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
2d90: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
2da0: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
2db0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2dc0: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
2dd0: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
2de0: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
2df0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
2e00: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
2e10: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
2e20: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
2e30: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
2e40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2e50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
2e60: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
2e70: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2e80: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
2e90: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
2ea0: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
2eb0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
2ec0: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
2ed0: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
2ee0: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
2ef0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
2f00: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
2f10: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
2f20: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
2f30: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
2f40: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
2f50: 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d       /* An argum
2f60: 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f  ent to the dispo
2f70: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
2f80: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
2fa0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
2fb0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
2fc0: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
2fe0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
2ff0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
3000: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
3010: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3020: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
3030: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
3040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
3050: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3060: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
3070: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
3080: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3090: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
30a0: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
30b0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
30c0: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
30d0: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
30e0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
30f0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66  {.    if( p->iOf
3100: 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  fset>=0 ){.     
3110: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
3120: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3130: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
3140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3150: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
3160: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 32 29  iOffset, addr+2)
3170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
3190: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
31a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
31b0: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
31c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
31d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
31e0: 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69  emIncr, p->iLimi
31f0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
3200: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  }.  }..  /* Pull
3210: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
3220: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
3230: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
3240: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3250: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3270: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
3280: 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20  n, srcTab, i);. 
3290: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
32a0: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69    nColumn = pELi
32b0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
32c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
32d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
32e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
3300: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
3310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3320: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
3330: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
3340: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
3350: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
3360: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
3370: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
3380: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
3390: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
33a0: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
33b0: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
33c0: 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  if( distinct>=0 
33d0: 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  && pEList && pEL
33e0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 0a  ist->nExpr>0 ){.
33f0: 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  #if NULL_ALWAYS_
3400: 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73 71 6c  DISTINCT.    sql
3410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3420: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c   OP_IsNull, -pEL
3430: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69  ist->nExpr, sqli
3440: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3450: 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66  dr(v)+7);.#endif
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3480: 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Key, pEList->nEx
3490: 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
34a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
34b0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c  _format>=4 ) sql
34c0: 69 74 65 33 41 64 64 4b 65 79 54 79 70 65 28 76  ite3AddKeyType(v
34d0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
34e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
34f0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
3500: 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65  distinct, sqlite
3510: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3520: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
3530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3540: 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e  OP_Pop, pEList->
3550: 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20  nExpr+1, 0);.   
3560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3570: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3580: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35a0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
35b0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
35c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
35d0: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73  P_PutStrKey, dis
35e0: 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a  tinct, 0);.  }..
35f0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
3600: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
3610: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
3620: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
3630: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
3640: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
3650: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
3660: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3670: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
3680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3690: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
36a0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
36b0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
36c0: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
36d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
36e0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
36f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3710: 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c  utStrKey, iParm,
3720: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
3730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3740: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
3750: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
3760: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
3770: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3780: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
3790: 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20   SRT_TempTable: 
37a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
37b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
37c0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
37d0: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  mn, 0);.      if
37e0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
37f0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3800: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3810: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3840: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
3850: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
3860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3870: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
3880: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
3890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
38a0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
38b0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
38c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
38d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
38e0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
38f0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
3900: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
3910: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
3920: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
3930: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
3940: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
3950: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
3960: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
3970: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
3980: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3990: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
39a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
39b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
39c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
39d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
39e0: 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  umn, NULL_ALWAYS
39f0: 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20  _DISTINCT);.    
3a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3a10: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
3a20: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
3a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3a50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
3a60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3a70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
3a80: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
3a90: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
3aa0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
3ab0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
3ac0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
3ad0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
3ae0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
3af0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
3b00: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
3b10: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
3b20: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
3b30: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
3b40: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
3b50: 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d       int addr1 =
3b60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3b70: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
3b80: 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 20 20 20    int addr2;.   
3b90: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
3ba0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
3bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3bc0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
3bd0: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
3be0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3bf0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
3c00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
3c10: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3c20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3c30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3c40: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3c50: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3c60: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3c70: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ca0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3cd0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ce0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3cf0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
3d00: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
3d10: 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33 56 64  addr2, sqlite3Vd
3d20: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3d30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
3d50: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
3d60: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
3d70: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3d80: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
3d90: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
3da0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
3db0: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
3dc0: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
3dd0: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
3de0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
3df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3e00: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
3e10: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3e20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3e30: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3e40: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
3e50: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
3e60: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
3e70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3e80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3e90: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
3ea0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 1);.        s
3eb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3ec0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3ed0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Break);.      }.
3ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ef0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
3f00: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
3f10: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
3f20: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
3f30: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
3f40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f  .    case SRT_So
3f50: 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66  rter: {.      if
3f60: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3f80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
3f90: 74 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d  tMakeRec, nColum
3fa0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
3fb0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3fc0: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3fd0: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
3fe0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3ff0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
4000: 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  back );.        
4010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4020: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
4030: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4040: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4050: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4060: 20 49 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75   Invoke a subrou
4070: 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  tine to handle t
4080: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
4090: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
40a0: 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73  lf.    ** is res
40b0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70  ponsible for pop
40c0: 70 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ping the results
40d0: 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63   off of the stac
40e0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
40f0: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
4100: 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
4110: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4130: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
4140: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
4150: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
4160: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4170: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4180: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4190: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
41a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
41b0: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
41c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
41d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
41e0: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
41f0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
4200: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
4210: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
4220: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
4230: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
4240: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
4250: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
4260: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
4270: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
4280: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
4290: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
42a0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
42b0: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
42c0: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
42d0: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
42e0: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
42f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4300: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
4310: 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rd );.      sqli
4320: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4330: 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c  OP_Pop, nColumn,
4340: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4360: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4370: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
4380: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
4390: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
43a0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
43b0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
43c0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
43d0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
43e0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
43f0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
4400: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
4410: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
4420: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
4430: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
4440: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
4450: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4460: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
4470: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
4480: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
4490: 54 61 69 6c 28 0a 20 20 53 65 6c 65 63 74 20 2a  Tail(.  Select *
44a0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
44b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
44c0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
44d0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
44e0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
44f0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
4500: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  nColumn,     /* 
4510: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4520: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  s of data */.  i
4530: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
4540: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
4550: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
4560: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
4570: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
4580: 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73 73  al parameter ass
4590: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44 65  ociated with eDe
45a0: 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  st */.){.  int e
45b0: 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nd1 = sqlite3Vdb
45c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
45d0: 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c 69   int end2 = sqli
45e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
45f0: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
4600: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4610: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4620: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
4630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4640: 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20  , 0, 0);.  addr 
4650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4660: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78  Op(v, OP_SortNex
4670: 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 69  t, 0, end1);.  i
4680: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30  f( p->iOffset>=0
4690: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
46a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
46b0: 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73  emIncr, p->iOffs
46c0: 65 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20  et, addr+4);.   
46d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
46e0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
46f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
4700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4710: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
4720: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
4730: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
4740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4750: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
4760: 69 4c 69 6d 69 74 2c 20 65 6e 64 32 29 3b 0a 20  iLimit, end2);. 
4770: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65   }.  switch( eDe
4780: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
4790: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  RT_Callback: {. 
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
47c0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
47d0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
47e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
47f0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4800: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
4810: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
4820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4830: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
4840: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4860: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
4870: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4880: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4890: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
48a0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
48b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48c0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
48d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
48e0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
48f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4900: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4910: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4920: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4940: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4950: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4970: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4980: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4990: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
49a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
49b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
49c0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
49d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
49e0: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
49f0: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
4a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4a10: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
4a20: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
4a30: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4a60: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
4a70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4a80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4a90: 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Goto, 0, end1);.
4aa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ab0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4ac0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
4ad0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4ae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
4af0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
4b00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b10: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
4b20: 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20  , -1-i, i);.    
4b30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4b40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4b50: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
4b60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4b70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b80: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4ba0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4bb0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
4bc0: 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
4bd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4bf0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
4c00: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
4c10: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
4c20: 2c 20 65 6e 64 32 29 3b 0a 20 20 73 71 6c 69 74  , end2);.  sqlit
4c30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c40: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
4c50: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
4c60: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 31 29  veLabel(v, end1)
4c70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4c80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52  ddOp(v, OP_SortR
4c90: 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  eset, 0, 0);.}..
4ca0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4cb0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
4cc0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
4cd0: 64 61 74 61 74 79 70 65 73 20 6f 66 0a 2a 2a 20  datatypes of.** 
4ce0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
4cf0: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  esult set..**.**
4d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
4d10: 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ly generates cod
4d20: 65 20 69 66 20 74 68 65 20 22 50 52 41 47 4d 41  e if the "PRAGMA
4d30: 20 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73 3d   show_datatypes=
4d40: 6f 6e 22 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  on".** has been 
4d50: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 64  executed.  The d
4d60: 61 74 61 74 79 70 65 73 20 61 72 65 20 72 65 70  atatypes are rep
4d70: 6f 72 74 65 64 20 6f 75 74 20 69 6e 20 74 68 65  orted out in the
4d80: 20 61 7a 43 6f 6c 0a 2a 2a 20 70 61 72 61 6d 65   azCol.** parame
4d90: 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ter to the callb
4da0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ack function.  T
4db0: 68 65 20 66 69 72 73 74 20 4e 20 61 7a 43 6f 6c  he first N azCol
4dc0: 5b 5d 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 72  [] entries.** ar
4dd0: 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
4de0: 68 65 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64 20  he columns, and 
4df0: 74 68 65 20 73 65 63 6f 6e 64 20 4e 20 65 6e 74  the second N ent
4e00: 72 69 65 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ries are the.** 
4e10: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 74 68  datatypes for th
4e20: 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  e columns..**.**
4e30: 20 54 68 65 20 22 64 61 74 61 74 79 70 65 22 20   The "datatype" 
4e40: 66 6f 72 20 61 20 72 65 73 75 6c 74 20 74 68 61  for a result tha
4e50: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  t is a column of
4e60: 20 61 20 74 79 70 65 20 69 73 20 74 68 65 0a 2a   a type is the.*
4e70: 2a 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  * datatype defin
4e80: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
4e90: 66 72 6f 6d 20 74 68 65 20 43 52 45 41 54 45 20  from the CREATE 
4ea0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4eb0: 0a 2a 2a 20 54 68 65 20 64 61 74 61 74 79 70 65  .** The datatype
4ec0: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
4ed0: 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58  on is either TEX
4ee0: 54 20 6f 72 20 4e 55 4d 45 52 49 43 2e 20 20 54  T or NUMERIC.  T
4ef0: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 20 66  he.** datatype f
4f00: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
4f10: 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a   is INTEGER..*/.
4f20: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4f30: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
4f40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4f50: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
4f60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
4f70: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4f80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
4f90: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
4fa0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
4fb0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
4fc0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
4fd0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
4fe0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4ff0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
5000: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5020: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
5030: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
5040: 78 70 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  xpr;.    char *z
5050: 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Type = 0;.    if
5060: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
5070: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  e;.    if( p->op
5080: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
5090: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
50a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
50b0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
50c0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
50d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
50e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
50f0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
5100: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
5110: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
5120: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
5130: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
5140: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
5150: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
5160: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
5170: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
5180: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
5190: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
51a0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
51b0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
51c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
51d0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
51e0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
51f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5200: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
5210: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
5220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5230: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  se{.      if( sq
5240: 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70 29  lite3ExprType(p)
5250: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
5260: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70   ){.        zTyp
5270: 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20  e = "TEXT";.    
5280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5290: 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d 45 52 49   zType = "NUMERI
52a0: 43 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C";.      }.    
52b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
52c0: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  eOp3(v, OP_Colum
52d0: 6e 4e 61 6d 65 2c 20 69 20 2b 20 70 45 4c 69 73  nName, i + pELis
52e0: 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 7a 54 79  t->nExpr, 0, zTy
52f0: 70 65 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe, 0);.  }.}../
5300: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5310: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
5320: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
5330: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
5340: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
5350: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
5360: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
5370: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
5380: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
5390: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
53a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
53b0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
53c0: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
53d0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
53e0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
53f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
5400: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
5410: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
5420: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
5430: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
5440: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
5450: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
5460: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5470: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
5480: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 20 2a  i, j;.  sqlite *
5490: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
54a0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
54b0: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 20  , shortNames;.. 
54c0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
54d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
54e0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
54f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5500: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5510: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5520: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5530: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5540: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5550: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5560: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5570: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5580: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
5590: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 66 6f 72  Names)!=0;.  for
55a0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
55b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
55c0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 6e   Expr *p;.    in
55d0: 74 20 70 32 20 3d 20 69 3d 3d 70 45 4c 69 73 74  t p2 = i==pEList
55e0: 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 70  ->nExpr-1;.    p
55f0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
5600: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
5610: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5620: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
5630: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
5640: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
5650: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
5660: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
5670: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
5680: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5690: 70 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  p2, zName, 0);. 
56a0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
56b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
56c0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
56d0: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
56e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
56f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
5700: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
5710: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
5720: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
5730: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
5740: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
5750: 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61  .iCursor!=p->iTa
5760: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
5770: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
5780: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
5790: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
57a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
57b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
57c0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
57d0: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
57e0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
57f0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
5800: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
5810: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
5830: 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20  l = "_ROWID_";. 
5840: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5850: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
5860: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5870: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5880: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
5890: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26   && !fullNames &
58a0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  & p->span.z && p
58b0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
58c0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
58d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  = sqlite3VdbeOp3
58e0: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
58f0: 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73 70 61 6e  , i, p2, p->span
5900: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
5910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5920: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
5930: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
5940: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
5950: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
5960: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
5970: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
5980: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
5990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
59a0: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
59b0: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
59c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
59d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
59e0: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
59f0: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
5a00: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
5a10: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
5a20: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
5a30: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
5a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5a50: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  beOp3(v, OP_Colu
5a60: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a  mnName, i, p2, z
5a70: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
5a80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5aa0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
5ab0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20  umnName, i, p2, 
5ac0: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
5ad0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
5ae0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
5af0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
5b00: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
5b10: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 4f  lite3VdbeOp3(v,O
5b20: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
5b30: 20 70 32 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   p2, p->span.z, 
5b40: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
5b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d    sqlite3VdbeCom
5b60: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
5b70: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
5b80: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
5b90: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  [30];.      asse
5ba0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
5bb0: 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74  LUMN || pTabList
5bc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72  ==0 );.      spr
5bd0: 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c  intf(zName, "col
5be0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
5bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
5c00: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  p3(v, OP_ColumnN
5c10: 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a 4e 61 6d  ame, i, p2, zNam
5c20: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
5c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
5c40: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5c50: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
5c60: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
5c70: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
5c80: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
5c90: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
5ca0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
5cb0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
5cc0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
5cd0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
5ce0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5cf0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
5d00: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
5d10: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
5d20: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
5d30: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
5d40: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
5d50: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
5d60: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
5d70: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
5d90: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
5da0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
5db0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
5dc0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65  ColumnList(Parse
5dd0: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a  *, Select*);../*
5de0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
5df0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
5e00: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
5e10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
5e20: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
5e30: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
5e40: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
5e50: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
5e60: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
5e70: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
5e80: 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65   *zTabName, Sele
5e90: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
5ea0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
5eb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c  nt i, j;.  ExprL
5ec0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43  ist *pEList;.  C
5ed0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a 20 20  olumn *aCol;..  
5ee0: 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
5ef0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
5f00: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
5f10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
5f20: 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  b = sqliteMalloc
5f30: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
5f40: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
5f50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5f60: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e  ;.  }.  pTab->zN
5f70: 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f  ame = zTabName ?
5f80: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54   sqliteStrDup(zT
5f90: 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70  abName) : 0;.  p
5fa0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
5fb0: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d  >pEList;.  pTab-
5fc0: 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  >nCol = pEList->
5fd0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
5fe0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
5ff0: 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  .  pTab->aCol = 
6000: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  aCol = sqliteMal
6010: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62  loc( sizeof(pTab
6020: 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d  ->aCol[0])*pTab-
6030: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69  >nCol );.  for(i
6040: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
6050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
6060: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 69 66   *p, *pR;.    if
6070: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
6080: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 43  Name ){.      aC
6090: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  ol[i].zName = sq
60a0: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
60b0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
60c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
60d0: 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  =pEList->a[i].pE
60e0: 78 70 72 29 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  xpr)->op==TK_DOT
60f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6100: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
6110: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
6120: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
6130: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6140: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20 20 73  int cnt;.      s
6150: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
6160: 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  (&aCol[i].zName,
6170: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52   pR->token.z, pR
6180: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
6190: 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30       for(j=cnt=0
61a0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
61b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
61c0: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
61d0: 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a  zName, aCol[i].z
61e0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
61f0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
6200: 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
6210: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [30];.          
6220: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
6230: 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  d",++cnt);.     
6240: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
6250: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
6260: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6270: 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ng(&aCol[i].zNam
6280: 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  e, pR->token.z, 
6290: 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42 75  pR->token.n, zBu
62a0: 66 2c 20 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  f, n,0);.       
62b0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
62c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
62d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
62e0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
62f0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
6300: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
6310: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &pTab->aCol[i].z
6320: 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  Name, p->span.z,
6330: 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a   p->span.n, 0);.
6340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6350: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
6360: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
6370: 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  uf, "column%d", 
6380: 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62  i+1);.      pTab
6390: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20  ->aCol[i].zName 
63a0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
63b0: 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
63c0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
63d0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
63e0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  b;.}../*.** For 
63f0: 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
6400: 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74   statement, do t
6410: 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a  hree things..**.
6420: 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20  **    (1)  Fill 
6430: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
6440: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
6450: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
6460: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
6470: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
6480: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
6490: 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65  should be scanne
64a0: 64 2e 20 20 46 6f 72 20 76 69 65 77 73 2c 0a 2a  d.  For views,.*
64b0: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
64c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
64d0: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
64e0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
64f0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
6500: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
6510: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
6520: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
6530: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
6540: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
6550: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
6560: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
6570: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
6580: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
6590: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
65a0: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
65b0: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
65c0: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
65d0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
65e0: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
6600: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
6610: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
6620: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
6630: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
6640: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
6650: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
6660: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
6670: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
6680: 20 20 28 33 29 20 20 53 63 61 6e 20 74 68 65 20    (3)  Scan the 
6690: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
66a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
66b0: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
66c0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
66d0: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
66e0: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
66f0: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
6700: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
6710: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
6720: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
6730: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
6740: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
6750: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
6760: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
6770: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
6780: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
6790: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
67a0: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
67b0: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
67c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
67d0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
67e0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
67f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6800: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
6810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6820: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6830: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
6840: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
6850: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
6860: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
6870: 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  Tab;..  if( p==0
6880: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29   || p->pSrc==0 )
6890: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61   return 1;.  pTa
68a0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
68b0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
68c0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  EList;..  /* Loo
68d0: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
68e0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
68f0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  st..  */.  for(i
6900: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
6910: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
6920: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
6930: 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  i].pTab ){.     
6940: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
6950: 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21   has run before!
6960: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e    No need to con
6970: 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72  tinue */.      r
6980: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6990: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
69a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
69b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
69c0: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
69d0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
69e0: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
69f0: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
6a00: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30  >a[i].pSelect!=0
6a10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
6a20: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6a30: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
6a40: 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65    char zFakeName
6a50: 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70  [60];.        sp
6a60: 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c  rintf(zFakeName,
6a70: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
6a80: 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20  y_%p_",.        
6a90: 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69     (void*)pTabLi
6aa0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6ac0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 54 61  e3SetString(&pTa
6ad0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6ae0: 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30  as, zFakeName, 0
6af0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6b00: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6b10: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
6b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6b30: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
6b40: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6b50: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
6b90: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
6ba0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6bb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6bc0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6bd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
6be0: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
6bf0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
6c00: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
6c10: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
6c20: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
6c30: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
6c40: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
6c50: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
6c60: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
6c70: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
6c80: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
6c90: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
6ca0: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
6cb0: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
6cc0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
6cd0: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
6ce0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
6cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d00: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
6d10: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
6d20: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
6d30: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
6d40: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6d50: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
6d60: 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
6d70: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54  eTable(pParse,pT
6d80: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
6d90: 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  me,pTabList->a[i
6da0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
6db0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
6dc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6dd0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
6de0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
6df0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
6e00: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
6e10: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
6e20: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
6e30: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
6e40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
6e50: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
6e60: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
6e70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6e80: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
6e90: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61         /* If pTa
6ea0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6eb0: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
6ec0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
6ed0: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
6ee0: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
6ef0: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
6f00: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
6f10: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
6f20: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
6f30: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
6f40: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
6f50: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
6f60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
6f70: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
6f80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6f90: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6fa0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
6fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
6fc0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
6fd0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
6fe0: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
6ff0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7000: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7010: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
7020: 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
7030: 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
7040: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
7050: 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
7060: 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  ( sqliteProcessJ
7070: 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
7080: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
7090: 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
70a0: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
70b0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
70c0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
70d0: 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
70e0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
70f0: 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
7100: 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
7110: 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
7120: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
7130: 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
7140: 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
7150: 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
7160: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
7170: 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
7180: 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
7190: 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
71a0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
71b0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
71c0: 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
71d0: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
71e0: 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
71f0: 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
7200: 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
7210: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
7220: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
7230: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
7240: 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
7250: 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
7260: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7270: 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
7280: 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
7290: 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
72a0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
72b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
72c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
72d0: 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
72e0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
72f0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
7300: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  ak;.    if( pE->
7310: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
7320: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e  ->pRight && pE->
7330: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
7340: 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  LL.         && p
7350: 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e  E->pLeft && pE->
7360: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
7370: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
7380: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c  rc = 0;.  if( k<
7390: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
73a0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
73b0: 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
73c0: 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
73d0: 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
73e0: 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
73f0: 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
7400: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
7410: 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
7420: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
7430: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
7440: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7450: 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
7460: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
7470: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
7480: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
7490: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
74a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
74b0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
74c0: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
74d0: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
74e0: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
74f0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7500: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
7510: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
7520: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
7530: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
7540: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
7550: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
7560: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
7570: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
7580: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
7590: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
75a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
75b0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
75c0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
75d0: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
75e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
75f0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
7600: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
7610: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7620: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
7630: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
7640: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
7650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
7660: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7670: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
7680: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
7690: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
76a0: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
76b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
76c0: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
76d0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
76e0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
76f0: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
7700: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
7710: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
7720: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
7730: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
7740: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
7750: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7760: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
7770: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7780: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7790: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
77a0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
77b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
77c0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
77d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
77e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
77f0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
7800: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
7810: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
7820: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
7830: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
7840: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
7850: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7860: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
7870: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
7880: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
78a0: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
78b0: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
78c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
78f0: 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61  pName->z, zTabNa
7900: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30  me, pName->n)!=0
7910: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
7920: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e       zTabName[pN
7930: 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20  ame->n]!=0) ){. 
7940: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
7950: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
7960: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
7970: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
7980: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7990: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
79a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
79b0: 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74  r *pExpr, *pLeft
79c0: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
79d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
79e0: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
79f0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
7a00: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7a10: 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  & (pTabList->a[i
7a20: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
7a30: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
7a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7a50: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61   columnIndex(pTa
7a60: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54  bList->a[i-1].pT
7a70: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
7a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
7a90: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
7aa0: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
7ab0: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
7ac0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
7ad0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
7ae0: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
7af0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7b00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7b10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
7b20: 28 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ( i>0 && sqlite3
7b30: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62  IdListIndex(pTab
7b40: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73  List->a[i-1].pUs
7b50: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
7b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7b70: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
7b80: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
7b90: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
7ba0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
7bb0: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
7bc0: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
7bd0: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
7be0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7bf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7c00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c10: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
7c20: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
7c30: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7c40: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
7c50: 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
7c60: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
7c70: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61  t->token.z = zNa
7c80: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7c90: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20  pRight->token.n 
7ca0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7cc0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  ght->token.dyn =
7cd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
7ce0: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  if( zTabName && 
7cf0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
7d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7d10: 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
7d20: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
7d30: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
7d40: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
7d50: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
7d60: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
7d70: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7d80: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
7d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7da0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
7db0: 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b  en.z = zTabName;
7dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7dd0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
7de0: 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29  strlen(zTabName)
7df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7e00: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pLeft->token.dyn
7e10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7e20: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
7e30: 72 69 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45  ring((char**)&pE
7e40: 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61  xpr->span.z, zTa
7e50: 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d  bName, ".", zNam
7e60: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
7e70: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
7e80: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70  .n = strlen(pExp
7e90: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
7ea0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7eb0: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7ed0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7ef0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
7f00: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
7f10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
7f20: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
7f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f40: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
7f50: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
7f60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
7f70: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
7f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
7fa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7fb0: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70  stAppend(pNew, p
7fc0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
7fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7fe0: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
7ff0: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
8000: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b      if( pName ){
8010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
8020: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8030: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
8040: 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d 65 29  ble: %T", pName)
8050: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8060: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8070: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8080: 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
8090: 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
80a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
80b0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
80c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
80d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
80e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
80f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
8100: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
8110: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8130: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
8140: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
8150: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
8160: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
8170: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
8180: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
8190: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
81a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
81b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
81c0: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
81d0: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
81e0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
81f0: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
8200: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
8210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8220: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
8230: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
8240: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
8250: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8260: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
8270: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8280: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
8290: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
82a0: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
82b0: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
82c0: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
82d0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
82e0: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
82f0: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
8300: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
8310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64 69  .** If the bindi
8320: 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f  ngs are not remo
8330: 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 65  ved, then the Se
8340: 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70  lect.pSrc->a[].p
8350: 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c  Tab field.** wil
8360: 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
8370: 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61  ng to a dealloca
8380: 74 65 64 20 54 61 62 6c 65 20 73 74 72 75 63 74  ted Table struct
8390: 75 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a 2a  ure after the.**
83a0: 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72 65   DROP and a core
83b0: 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72 20  dump will occur 
83c0: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
83d0: 65 20 56 49 45 57 20 69 73 20 75 73 65 64 2e 0a  e VIEW is used..
83e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
83f0: 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65  electUnbind(Sele
8400: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
8410: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8420: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61   = p->pSrc;.  Ta
8430: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
8440: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
8450: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8460: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
8470: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
8480: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
8490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
84a0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
84b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
84c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
84d0: 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  0, pTab);.      
84e0: 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  }.      pSrc->a[
84f0: 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  i].pTab = 0;.   
8500: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
8510: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
8520: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
8530: 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61  ctUnbind(pSrc->a
8540: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
8550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8560: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8570: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
8580: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
8590: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
85a0: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
85b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
85c0: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
85d0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
85e0: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
85f0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8600: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
8610: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
8620: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
8630: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
8640: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8650: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
8660: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
8670: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
8680: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
8690: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
86a0: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
86b0: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
86c0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
86d0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
86e0: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
86f0: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
8700: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
8710: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
8720: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
8730: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
8740: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
8750: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
8760: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
8770: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
8780: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
8790: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
87a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
87b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
87c0: 73 20 4e 4f 54 20 63 6f 72 72 65 63 74 6c 79 20  s NOT correctly 
87d0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 45  initialize the E
87e0: 78 70 72 2e 64 61 74 61 54 79 70 65 20 20 66 69  xpr.dataType  fi
87f0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 52  eld.** of the OR
8800: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8810: 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74 69 53 65  ns.  The multiSe
8820: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 29 20  lectSortOrder() 
8830: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
8840: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  be called to do 
8850: 74 68 61 74 20 61 66 74 65 72 20 74 68 65 20 69  that after the i
8860: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
8870: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68   statements.** h
8880: 61 76 65 20 61 6c 6c 20 62 65 65 6e 20 61 6e 61  ave all been ana
8890: 6c 79 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75  lyzed.  This rou
88a0: 74 69 6e 65 20 69 73 20 75 6e 61 62 6c 65 20 74  tine is unable t
88b0: 6f 20 63 6f 6d 70 75 74 65 20 45 78 70 72 2e 64  o compute Expr.d
88c0: 61 74 61 54 79 70 65 0a 2a 2a 20 62 65 63 61 75  ataType.** becau
88d0: 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  se it must be ca
88e0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  lled before the 
88f0: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
8900: 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  t statements.** 
8910: 68 61 76 65 20 62 65 65 6e 20 61 6e 61 6c 79 7a  have been analyz
8920: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8930: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
8940: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
8950: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8960: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
8970: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
8980: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
8990: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
89a0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
89b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
89c0: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
89d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
89e0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
89f0: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
8a00: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
8a10: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
8a20: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
8a30: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
8a40: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
8a50: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
8a60: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
8a70: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
8a80: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
8a90: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
8aa0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
8ab0: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
8ac0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
8ad0: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
8ae0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
8af0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
8b00: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
8b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
8b20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8b30: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
8b40: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
8b50: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e    }.  if( fillIn
8b60: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
8b70: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
8b80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8b90: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
8ba0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
8bb0: 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  ( matchOrderbyTo
8bc0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
8bd0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20  Select->pPrior, 
8be0: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
8bf0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
8c00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
8c10: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
8c20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8c40: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8c50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
8c60: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8c70: 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  pExpr;.    int i
8c80: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Col = -1;.    if
8c90: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
8ca0: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
8cb0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
8cc0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
8cd0: 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20  E, &iCol) ){.   
8ce0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c     if( iCol<=0 |
8cf0: 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
8d00: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
8d10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8d20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
8d30: 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69    "ORDER BY posi
8d40: 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62  tion %d should b
8d50: 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
8d60: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69  %d",.          i
8d70: 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
8d80: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  pr);.        nEr
8d90: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r++;.        bre
8da0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8db0: 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c    if( !mustCompl
8dc0: 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ete ) continue;.
8dd0: 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20        iCol--;.  
8de0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b    }.    for(j=0;
8df0: 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c   iCol<0 && j<pEL
8e00: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
8e10: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
8e20: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26  st->a[j].zName &
8e30: 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  & (pE->op==TK_ID
8e40: 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53   || pE->op==TK_S
8e50: 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20  TRING) ){.      
8e60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a    char *zName, *
8e70: 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20  zLabel;.        
8e80: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8e90: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
8ea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
8eb0: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
8ec0: 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69     zLabel = sqli
8ed0: 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f  teStrNDup(pE->to
8ee0: 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e  ken.z, pE->token
8ef0: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  .n);.        sql
8f00: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4c 61 62  ite3Dequote(zLab
8f10: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  el);.        if(
8f20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8f30: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
8f40: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
8f50: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
8f60: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
8f70: 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a  teFree(zLabel);.
8f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8f90: 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69  ( iCol<0 && sqli
8fa0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
8fb0: 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  E, pEList->a[j].
8fc0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
8fd0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
8fe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8ff0: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
9000: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
9010: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d  OLUMN;.      pE-
9020: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
9030: 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c  .      pE->iTabl
9040: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
9050: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9060: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
9070: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
9080: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
9090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
90a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
90b0: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
90c0: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
90d0: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
90e0: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
90f0: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
9100: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
9110: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9120: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
9130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
9140: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
9150: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
9160: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
9170: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
9180: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
9190: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
91a0: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
91b0: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
91c0: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
91d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
91e0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
91f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9200: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
9210: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
9220: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
9230: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
9240: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9250: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
9260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9270: 6e 65 20 73 65 74 73 20 74 68 65 20 45 78 70 72  ne sets the Expr
9280: 2e 64 61 74 61 54 79 70 65 20 66 69 65 6c 64 20  .dataType field 
9290: 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  on all elements 
92a0: 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  of.** the pOrder
92b0: 42 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  By expression li
92c0: 73 74 2e 20 20 54 68 65 20 70 4f 72 64 65 72 42  st.  The pOrderB
92d0: 79 20 6c 69 73 74 20 77 69 6c 6c 20 68 61 76 65  y list will have
92e0: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20   been.** set up 
92f0: 62 79 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  by matchOrderbyT
9300: 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63  oColumn().  Henc
9310: 65 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  e each expressio
9320: 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f  n has.** a TK_CO
9330: 4c 55 4d 4e 20 61 73 20 69 74 73 20 72 6f 6f 74  LUMN as its root
9340: 20 6e 6f 64 65 2e 20 20 54 68 65 20 45 78 70 72   node.  The Expr
9350: 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20  .iColumn refers 
9360: 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  to a .** column 
9370: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9380: 74 2e 20 20 20 54 68 65 20 64 61 74 61 74 79 70  t.   The datatyp
9390: 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
93a0: 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66  TE_SO_TEXT.** if
93b0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
93c0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61  ng column in p a
93d0: 6e 64 20 65 76 65 72 79 20 53 45 4c 45 43 54 20  nd every SELECT 
93e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a  to the left of.*
93f0: 2a 20 70 20 68 61 73 20 61 20 64 61 74 61 74 79  * p has a dataty
9400: 70 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f  pe of SQLITE_SO_
9410: 54 45 58 54 2e 20 20 49 66 20 74 68 65 20 63 6f  TEXT.  If the co
9420: 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  oressponding col
9430: 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61  umn.** in p or a
9440: 6e 79 20 6f 66 20 74 68 65 20 6c 65 66 74 20 53  ny of the left S
9450: 45 4c 45 43 54 73 20 69 73 20 53 51 4c 49 54 45  ELECTs is SQLITE
9460: 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68  _SO_NUM, then th
9470: 65 20 64 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66  e datatype.** of
9480: 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 65 78   the order-by ex
9490: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 20  pression is set 
94a0: 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  to SQLITE_SO_NUM
94b0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
94c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
94d0: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 20 49  TE TABLE one(a I
94e0: 4e 54 45 47 45 52 2c 20 62 20 54 45 58 54 29 3b  NTEGER, b TEXT);
94f0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
9500: 41 42 4c 45 20 74 77 6f 28 63 20 56 41 52 43 48  ABLE two(c VARCH
9510: 41 52 28 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b  AR(5), d FLOAT);
9520: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
9530: 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20  T b, b FROM one 
9540: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20  UNION SELECT d, 
9550: 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52  c FROM two ORDER
9560: 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20   BY 1, 2;.**.** 
9570: 54 68 65 20 70 72 69 6d 61 72 79 20 73 6f 72 74  The primary sort
9580: 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 53 51   key will use SQ
9590: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61  LITE_SO_NUM beca
95a0: 75 73 65 20 74 68 65 20 22 64 22 20 69 6e 0a 2a  use the "d" in.*
95b0: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 53 45 4c  * the second SEL
95c0: 45 43 54 20 69 73 20 6e 75 6d 65 72 69 63 2e 20  ECT is numeric. 
95d0: 20 54 68 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20   The 1st column 
95e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 53 45 4c  of the first SEL
95f0: 45 43 54 0a 2a 2a 20 69 73 20 74 65 78 74 20 62  ECT.** is text b
9600: 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ut that does not
9610: 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20   matter because 
9620: 61 20 6e 75 6d 65 72 69 63 20 61 6c 77 61 79 73  a numeric always
9630: 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a 20 61 20   overrides.** a 
9640: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  text..**.** The 
9650: 73 65 63 6f 6e 64 61 72 79 20 6b 65 79 20 77 69  secondary key wi
9660: 6c 6c 20 75 73 65 20 74 68 65 20 53 51 4c 49 54  ll use the SQLIT
9670: 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f  E_SO_TEXT sort o
9680: 72 64 65 72 20 62 65 63 61 75 73 65 0a 2a 2a 20  rder because.** 
9690: 62 6f 74 68 20 74 68 65 20 28 73 65 63 6f 6e 64  both the (second
96a0: 29 20 22 62 22 20 69 6e 20 74 68 65 20 66 69 72  ) "b" in the fir
96b0: 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 74 68  st SELECT and th
96c0: 65 20 22 63 22 20 69 6e 20 74 68 65 20 73 65 63  e "c" in the sec
96d0: 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61  ond.** SELECT ha
96e0: 76 65 20 61 20 64 61 74 61 74 79 70 65 20 6f 66  ve a datatype of
96f0: 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   text..*/ .stati
9700: 63 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65  c void multiSele
9710: 63 74 53 6f 72 74 4f 72 64 65 72 28 53 65 6c 65  ctSortOrder(Sele
9720: 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  ct *p, ExprList 
9730: 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e  *pOrderBy){.  in
9740: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
9750: 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  *pEList;.  if( p
9760: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
9770: 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  urn;.  if( p==0 
9780: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9790: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
97a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; i++){.      p
97b0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
97c0: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
97d0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
97e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
97f0: 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c  ;.  }.  multiSel
9800: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e  ectSortOrder(p->
9810: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
9820: 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  );.  pEList = p-
9830: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
9840: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9850: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9860: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
9870: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9880: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 64 61  ;.    if( pE->da
9890: 74 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53  taType==SQLITE_S
98a0: 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65  O_NUM ) continue
98b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
98c0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a  ->iColumn>=0 );.
98d0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
98e0: 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d  nExpr>pE->iColum
98f0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64  n ){.      pE->d
9900: 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
9910: 33 45 78 70 72 54 79 70 65 28 70 45 4c 69 73 74  3ExprType(pEList
9920: 2d 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d  ->a[pE->iColumn]
9930: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
9940: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
9950: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
9960: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
9970: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
9980: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
9990: 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73  nLimit and nOffs
99a0: 65 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d  et fields.  nLim
99b0: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68  it and nOffset h
99c0: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 73  old the integers
99d0: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
99e0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
99f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
9a00: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
9a10: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
9a20: 6f 72 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68  ords.  Or that h
9a30: 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20  old -1 and 0 if 
9a40: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
9a50: 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69  re omitted..** i
9a60: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9a70: 74 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  t are the intege
9a80: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
9a90: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a  r numbers for.**
9aa0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
9ab0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  o compute the li
9ac0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
9ad0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   If there is no.
9ae0: 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  ** limit and/or 
9af0: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69  offset, then iLi
9b00: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
9b10: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
9b20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9b30: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
9b40: 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e  ues if iLimit an
9b50: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
9b60: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
9b70: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
9b80: 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20  d by nLimit and 
9b90: 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  nOffset.  iLimit
9ba0: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
9bb0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
9bc0: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
9bd0: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
9be0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
9bf0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
9c00: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
9c10: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
9c20: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e  ne..** Only if n
9c30: 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66  Limit>=0 or nOff
9c40: 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d  set>0 do the lim
9c50: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
9c60: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
9c70: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
9c80: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
9c90: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
9ca0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
9cb0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
9cc0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
9cd0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
9ce0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
9cf0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9d00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
9d10: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
9d20: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
9d30: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f   Select *p){.  /
9d40: 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  * .  ** If the c
9d50: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e  omparison is p->
9d60: 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c  nLimit>0 then "L
9d70: 49 4d 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20  IMIT 0" shows.  
9d80: 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74  ** all rows.  It
9d90: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
9da0: 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65  no limit. If the
9db0: 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a   comparision is.
9dc0: 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d    ** p->nLimit>=
9dd0: 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22  0 then "LIMIT 0"
9de0: 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74   show no rows at
9df0: 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49   all..  ** "LIMI
9e00: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
9e10: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
9e20: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
9e30: 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f   contraversy abo
9e40: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
9e50: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
9e60: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
9e70: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
9e80: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
9e90: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
9ea0: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
9eb0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
9ec0: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >nLimit>=0 ){.  
9ed0: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
9ee0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
9ef0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
9f00: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
9f10: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
9f20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
9f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9f40: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
9f50: 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->nLimit, 0);.  
9f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f70: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
9f80: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
9f90: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65   p->iLimit = iMe
9fa0: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  m;.  }.  if( p->
9fb0: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
9fc0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
9fd0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9fe0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9ff0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a000: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a010: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
a020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a030: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d   OP_Integer, -p-
a040: 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  >nOffset, 0);.  
a050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a060: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
a070: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
a080: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d   p->iOffset = iM
a090: 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  em;.  }.}../*.**
a0a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a0b0: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
a0c0: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
a0d0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
a0e0: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
a0f0: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
a100: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
a110: 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70  ueries..**.** "p
a120: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
a130: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
a140: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
a150: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
a160: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
a170: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
a180: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
a190: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
a1a0: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
a1b0: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
a1c0: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
a1d0: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
a1e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
a1f0: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
a200: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
a210: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
a220: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
a230: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
a240: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
a250: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
a260: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
a270: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
a280: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
a290: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
a2a0: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
a2b0: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
a2c0: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
a2d0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
a2e0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
a2f0: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
a300: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
a310: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
a320: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
a330: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
a340: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
a350: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a360: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
a370: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
a380: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
a390: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
a3a0: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
a3b0: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
a3c0: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
a3d0: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
a3e0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
a3f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
a400: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
a410: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
a420: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
a430: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
a440: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
a450: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
a460: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
a470: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
a480: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
a490: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
a4a0: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
a4b0: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
a4c0: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
a4d0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
a4e0: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
a4f0: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 50 61  t multiSelect(Pa
a500: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
a510: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
a520: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
a530: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a540: 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20       /* Success 
a550: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
a560: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
a570: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
a580: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
a590: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
a5a0: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
a5b0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
a5c0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
a5d0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
a5e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
a5f0: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
a600: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
a610: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
a620: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
a630: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 53  .  ** the last S
a640: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
a650: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
a660: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
a670: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
a680: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
a690: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a6a0: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
a6b0: 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ior;.  if( pPrio
a6c0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
a6d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a6e0: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
a6f0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
a700: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
a710: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
a720: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
a730: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74  p->op));.    ret
a740: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
a750: 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e   pPrior->nLimit>
a760: 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f  =0 || pPrior->nO
a770: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
a780: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a790: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
a7a0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
a7b0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
a7c0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
a7d0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
a7e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
a7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
a800: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
a810: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
a820: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
a830: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
a840: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
a850: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a860: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a870: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65  urn 1;..  /* Cre
a880: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
a890: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
a8a0: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
a8b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
a8c0: 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
a8d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a8e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a8f0: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
a900: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
a910: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
a920: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a930: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
a940: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
a950: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a960: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
a970: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a980: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
a990: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
a9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69   ){.        pPri
a9b0: 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->nLimit = p->
a9c0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  nLimit;.        
a9d0: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20  pPrior->nOffset 
a9e0: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
a9f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aa00: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
aa10: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
aa20: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
aa30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
aa40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
aa50: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
aa60: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
aa70: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
aa80: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
aa90: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
aaa0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
aab0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
aac0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d  = -1;.        p-
aad0: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
aae0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aaf0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ab00: 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
ab10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
ab20: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
ab30: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
ab40: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ab50: 72 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  rc;.        brea
ab60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
ab70: 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c   /* For UNION AL
ab80: 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66  L ... ORDER BY f
ab90: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
aba0: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
abb0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
abc0: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
abd0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
abe0: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
abf0: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
ac00: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
ac10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
ac20: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
ac30: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
ac40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
ac50: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
ac60: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
ac70: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
ac80: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
ac90: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
aca0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
acb0: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
acc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  */.      int nLi
acd0: 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a  mit, nOffset; /*
ace0: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
acf0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
ad00: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
ad10: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
ad20: 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f  derBy;  /* The O
ad30: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
ad40: 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c  or the right SEL
ad50: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  ECT */..      pr
ad60: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
ad70: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
ad80: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
ad90: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
ada0: 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f  priorOp && p->pO
adb0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
adc0: 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e  nLimit<0 && p->n
add0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
ade0: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
adf0: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
ae00: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
ae10: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
ae20: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
ae30: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
ae40: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
ae50: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
ae60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae70: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
ae80: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
ae90: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
aea0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
aeb0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
aec0: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
aed0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
aee0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
aef0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
af00: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
af10: 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26  erBy .        &&
af20: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
af30: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
af40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e   p->pOrderBy, un
af50: 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20  ionTab, 1) ){.  
af60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
af70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
af80: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
af90: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
afa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
afb0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
afc0: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  mp, unionTab, 1)
afd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
afe0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
aff0: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e  OP_KeyAsData, un
b000: 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20  ionTab, 1);.    
b010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b030: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b040: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
b050: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
b060: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
b070: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
b080: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
b090: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
b0a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b0b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
b0c0: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
b0d0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
b0e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
b0f0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
b100: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
b110: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
b120: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
b130: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
b140: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
b150: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
b160: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
b170: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
b180: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
b190: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
b1a0: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
b1b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
b1c0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
b1d0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
b1e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b1f0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
b200: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  = 0;.      pOrde
b210: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
b220: 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  y;.      p->pOrd
b230: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
b240: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
b250: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  it;.      p->nLi
b260: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
b270: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
b280: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  fset;.      p->n
b290: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
b2a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
b2b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
b2c0: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
b2d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
b2e0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
b2f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
b300: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
b310: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
b320: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
b330: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66  p->nOffset = nOf
b340: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
b350: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
b360: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
b370: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
b380: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
b390: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
b3a0: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
b3b0: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
b3c0: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
b3d0: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
b3e0: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
b3f0: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
b400: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
b410: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
b420: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
b430: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b440: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
b450: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b460: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
b470: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
b480: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
b490: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
b4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
b4b0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
b4c0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c  pParse, p->pSrc,
b4d0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
b4e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b4f0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
b500: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b510: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
b520: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b530: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b550: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b560: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
b570: 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  k);.        comp
b580: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
b590: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
b5a0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b5b0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b5c0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
b5d0: 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72    multiSelectSor
b5e0: 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72  tOrder(p, p->pOr
b5f0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
b600: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
b610: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
b620: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
b630: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
b640: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
b670: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
b680: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
b6b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
b6c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b6e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
b6f0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
b700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b710: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
b720: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
b730: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b740: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b750: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b770: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b780: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
b790: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
b7a0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
b7b0: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
b7c0: 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45  Tail(p, v, p->pE
b7d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
b7e0: 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20  st, iParm);.    
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b810: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
b820: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
b830: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
b840: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
b850: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
b860: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
b870: 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 20  t, nOffset;..   
b880: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
b890: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
b8a0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
b8b0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
b8c0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
b8d0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
b8e0: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
b8f0: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
b900: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
b910: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
b920: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
b930: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b940: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
b950: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
b960: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
b970: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
b980: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
b990: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
b9a0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
b9b0: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b9d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
b9e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b9f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
ba00: 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20  p, tab1, 1);.   
ba10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ba20: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
ba30: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
ba40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
ba50: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
ba60: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
ba70: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
ba80: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
ba90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
baa0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
bab0: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
bac0: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tab1, 0, 0, 0);.
bad0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
bae0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
baf0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
bb00: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
bb10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bb20: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
bb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
bb50: 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29  enTemp, tab2, 1)
bb60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bb70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
bb80: 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20  eyAsData, tab2, 
bb90: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  1);.      p->pPr
bba0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  ior = 0;.      n
bbb0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
bbc0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
bbd0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
bbe0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
bbf0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
bc00: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
bc10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
bc20: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
bc30: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
bc40: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
bc50: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
bc60: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  or;.      p->nLi
bc70: 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  mit = nLimit;.  
bc80: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
bc90: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
bca0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
bcb0: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  rc;..      /* Ge
bcc0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
bcd0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
bce0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
bcf0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
bd00: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
bd10: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
bd20: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bd30: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
bd40: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
bd50: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
bd60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
bd70: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
bd80: 29 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  );.        gener
bd90: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
bda0: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  Parse, p->pSrc, 
bdb0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
bdc0: 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
bdd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bde0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bdf0: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
be00: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
be10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
be20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
be30: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
be40: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d  reak);.      com
be50: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
be60: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
be70: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
be80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
be90: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
bea0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
beb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bec0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
bed0: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
bee0: 20 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f     multiSelectSo
bef0: 72 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f  rtOrder(p, p->pO
bf00: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72  rderBy);.      r
bf10: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
bf20: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
bf30: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
bf40: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
bf50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bf70: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
bf80: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
bfb0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
bfc0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
bfd0: 6e 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 1;.      sqlit
bfe0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
bff0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
c000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c010: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
c020: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
c030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c040: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c050: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
c060: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c070: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
c080: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
c090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c0a0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
c0b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
c0c0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
c0d0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
c0e0: 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d  ortTail(p, v, p-
c0f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
c100: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
c110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
c130: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c140: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
c150: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
c160: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
c170: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
c180: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
c190: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c1a0: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
c1b0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c1c0: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
c1d0: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
c1e0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
c1f0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
c200: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
c210: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
c220: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
c230: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
c240: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
c250: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
c260: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
c270: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
c280: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
c290: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
c2a0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
c2b0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
c2c0: 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
c2d0: 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
c2e0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
c2f0: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
c300: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
c310: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c320: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c330: 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
c340: 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
c350: 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
c360: 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
c370: 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
c380: 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
c390: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
c3a0: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
c3b0: 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
c3c0: 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
c3d0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
c3e0: 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
c3f0: 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
c400: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
c410: 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
c420: 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
c430: 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
c440: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
c450: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
c460: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
c470: 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
c480: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
c490: 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
c4a0: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
c4b0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
c4c0: 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20  nt,ExprList*);  
c4d0: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
c4e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c4f0: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
c500: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
c510: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
c520: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
c530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c540: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c550: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
c560: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
c570: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
c580: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
c590: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
c5a0: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
c5b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
c5c0: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
c5d0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
c5e0: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
c5f0: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
c600: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c610: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
c620: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
c630: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
c640: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
c650: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
c660: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
c670: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
c680: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
c690: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
c6a0: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
c6b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
c6c0: 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74  Type = pNew->dat
c6d0: 61 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  aType;.      ass
c6e0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
c6f0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
c700: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
c710: 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
c720: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c730: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
c740: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
c750: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
c760: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c770: 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a  (pNew->pRight);.
c780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
c790: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
c7a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
c7b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
c7c0: 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
c7d0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
c7e0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
c7f0: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
c800: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
c810: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
c820: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
c830: 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
c840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
c850: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
c860: 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
c870: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
c880: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  te3TokenCopy(&pE
c890: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
c8a0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
c8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
c8c0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
c8d0: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
c8e0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
c8f0: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
c900: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
c910: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
c920: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
c930: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
c940: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
c950: 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72   void .substExpr
c960: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
c970: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
c980: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
c990: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
c9a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c9b0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
c9c0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
c9d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
c9e0: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
c9f0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
ca00: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
ca10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ca20: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
ca30: 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
ca40: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
ca50: 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
ca60: 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
ca70: 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
ca80: 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
ca90: 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
caa0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
cab0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
cac0: 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
cad0: 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
cae0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
caf0: 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
cb00: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
cb10: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
cb20: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
cb30: 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
cb40: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
cb50: 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
cb60: 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
cb70: 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
cb80: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
cb90: 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
cba0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
cbb0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
cbc0: 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
cbd0: 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
cbe0: 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
cbf0: 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
cc00: 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
cc10: 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
cc20: 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
cc30: 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
cc40: 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
cc50: 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
cc60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
cc70: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
cc80: 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
cc90: 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
cca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
ccb0: 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
ccc0: 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
ccd0: 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
cce0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
ccf0: 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
cd00: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
cd10: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
cd20: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
cd30: 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
cd40: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
cd50: 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
cd60: 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
cd70: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
cd80: 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
cd90: 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
cda0: 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
cdb0: 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
cdc0: 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
cdd0: 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
cde0: 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
cdf0: 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
ce00: 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
ce10: 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
ce20: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
ce30: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
ce40: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
ce50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
ce60: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
ce70: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ce80: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
ce90: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
cea0: 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
ceb0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
cec0: 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
ced0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
cee0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
cef0: 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
cf00: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
cf10: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
cf20: 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
cf30: 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
cf40: 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
cf50: 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
cf60: 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
cf70: 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
cf80: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cf90: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
cfa0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
cfb0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
cfc0: 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
cfd0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
cfe0: 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
cff0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
d000: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
d010: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
d020: 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
d030: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
d040: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
d050: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
d060: 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
d070: 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
d080: 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
d090: 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
d0a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
d0b0: 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
d0c0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
d0d0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
d0e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
d0f0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
d100: 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
d110: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
d120: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
d130: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
d140: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
d150: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
d160: 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
d170: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
d180: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
d190: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
d1a0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
d1b0: 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
d1c0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
d1d0: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
d1e0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d1f0: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
d200: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d210: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
d220: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d230: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
d240: 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
d250: 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
d260: 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
d270: 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
d280: 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
d290: 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
d2a0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
d2b0: 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
d2c0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
d2d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
d2e0: 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
d2f0: 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
d300: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
d310: 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
d320: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
d330: 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
d340: 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
d350: 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
d360: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
d370: 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
d380: 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
d390: 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
d3a0: 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
d3b0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
d3c0: 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
d3d0: 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
d3e0: 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
d3f0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
d400: 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
d410: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
d420: 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
d430: 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
d440: 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
d450: 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
d460: 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
d470: 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
d480: 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
d490: 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
d4a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
d4b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
d4c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
d4d0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
d4e0: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
d4f0: 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
d500: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
d510: 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
d520: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
d530: 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
d540: 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
d550: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
d560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d570: 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
d580: 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
d590: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
d5a0: 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
d5b0: 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
d5c0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
d5d0: 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
d5e0: 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53  ctions */.){.  S
d5f0: 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
d600: 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
d610: 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
d620: 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ry" */.  SrcList
d630: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
d640: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
d650: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
d660: 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
d670: 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
d680: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
d690: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
d6a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d6b0: 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
d6c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d6d0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
d6e0: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
d6f0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
d700: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
d710: 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
d720: 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
d730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
d740: 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20   *pWhere;..  /* 
d750: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d760: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
d770: 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
d780: 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
d790: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
d7a0: 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
d7b0: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
d7c0: 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
d7d0: 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
d7e0: 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
d7f0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  b = pSrc->a[iFro
d800: 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m].pSelect;.  as
d810: 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
d820: 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
d830: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
d840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d850: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
d860: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
d870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
d880: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
d890: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
d8a0: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75  Src );.  if( pSu
d8b0: 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
d8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d8d0: 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
d8e0: 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  t || pSub->nLimi
d8f0: 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d  t>=0) &&  (pSrc-
d900: 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
d910: 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
d920: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
d930: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
d940: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  p->nLimit>=0) &&
d950: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
d960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d970: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
d980: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
d990: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
d9a0: 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
d9b0: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
d9c0: 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
d9d0: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
d9e0: 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
d9f0: 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
da00: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
da10: 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
da20: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
da30: 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
da40: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
da50: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
da60: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
da70: 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
da80: 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
da90: 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
daa0: 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
dab0: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
dac0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
dad0: 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
dae0: 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
daf0: 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
db00: 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
db10: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
db20: 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
db30: 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
db40: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
db50: 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
db60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
db70: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
db80: 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
db90: 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
dba0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
dbb0: 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
dbc0: 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
dbd0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
dbe0: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
dbf0: 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
dc00: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
dc10: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
dc20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
dc30: 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
dc40: 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
dc50: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
dc60: 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
dc70: 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
dc80: 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
dc90: 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
dca0: 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
dcb0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
dcc0: 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
dcd0: 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
dce0: 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
dcf0: 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
dd00: 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
dd10: 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
dd20: 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
dd30: 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
dd40: 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
dd50: 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
dd60: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
dd70: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
dd80: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
dd90: 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
dda0: 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
ddb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ddc0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
ddd0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
dde0: 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
ddf0: 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
de00: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
de10: 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
de20: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
de30: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
de40: 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
de50: 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
de60: 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
de70: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
de80: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
de90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
dea0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
deb0: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
dec0: 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
ded0: 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
dee0: 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
def0: 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
df00: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
df10: 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
df20: 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
df30: 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
df40: 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
df50: 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
df60: 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
df70: 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
df80: 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
df90: 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
dfa0: 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
dfb0: 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
dfc0: 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
dfd0: 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
dfe0: 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
dff0: 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
e000: 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
e010: 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72  .  iParent = pSr
e020: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72  c->a[iFrom].iCur
e030: 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  sor;.  {.    int
e040: 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
e050: 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
e060: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72  t jointype = pSr
e070: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
e080: 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70  type;..    if( p
e090: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
e0a0: 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46  ab && pSrc->a[iF
e0b0: 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61  rom].pTab->isTra
e0c0: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
e0d0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
e0e0: 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46  le(0, pSrc->a[iF
e0f0: 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  rom].pTab);.    
e100: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
e110: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
e120: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
e130: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
e140: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29  >a[iFrom].zName)
e150: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e160: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
e170: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
e180: 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
e190: 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
e1a0: 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
e1b0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
e1c0: 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
e1d0: 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
e1e0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
e1f0: 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  (pSrc, 0, 0);.  
e200: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
e210: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
e220: 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
e230: 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
e240: 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
e250: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
e260: 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
e270: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e280: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e290: 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
e2a0: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
e2b0: 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
e2c0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
e2d0: 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
e2e0: 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
e2f0: 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
e300: 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
e310: 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31  [iFrom+nSubSrc-1
e320: 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
e330: 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
e340: 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
e350: 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
e360: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
e370: 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
e380: 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
e390: 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
e3a0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
e3b0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
e3c0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
e3d0: 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
e3e0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
e3f0: 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
e400: 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
e410: 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
e440: 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
e450: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
e460: 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
e470: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e480: 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
e490: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e4a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
e4b0: 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
e4c0: 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
e4d0: 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
e4e0: 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
e4f0: 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
e500: 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
e510: 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
e520: 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
e530: 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
e540: 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
e550: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
e560: 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
e570: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e580: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  );.  pList = p->
e590: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
e5a0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e5b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e5c0: 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
e5d0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
e5e0: 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72  ame==0 && (pExpr
e5f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
e600: 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30  Expr)->span.z!=0
e610: 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
e620: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
e630: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
e640: 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
e650: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
e660: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
e670: 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
e680: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
e690: 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
e6a0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
e6b0: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
e6c0: 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
e6d0: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
e6e0: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72  .  if( pSub->pOr
e6f0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73  derBy ){.    ass
e700: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
e710: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  ==0 );.    p->pO
e720: 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
e730: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75  OrderBy;.    pSu
e740: 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
e750: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
e760: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e770: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
e780: 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
e790: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e7a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
e7b0: 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
e7c0: 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
e7d0: 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
e7e0: 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
e7f0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
e800: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
e810: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
e820: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
e830: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
e840: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
e850: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
e860: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
e870: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
e880: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
e890: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e8a0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48 61     if( pSub->pHa
e8b0: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45 78  ving ){.      Ex
e8c0: 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73 71  pr *pHaving = sq
e8d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
e8e0: 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  b->pHaving);.   
e8f0: 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
e900: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
e910: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
e920: 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  3Expr(TK_AND, p-
e930: 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69 6e  >pHaving, pHavin
e940: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g, 0);.      }el
e950: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  se{.        p->p
e960: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
e970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e990: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
e9a0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
e9b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
e9c0: 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  up(pSub->pGroupB
e9d0: 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  y);.  }else if( 
e9e0: 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  p->pWhere==0 ){.
e9f0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
ea00: 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b  pWhere;.  }else{
ea10: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
ea20: 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
ea30: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
ea40: 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65  ;.    if( pWhere
ea50: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68   ){.      p->pWh
ea60: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
ea70: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
ea80: 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ere, pWhere, 0);
ea90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
eaa0: 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
eab0: 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
eac0: 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
ead0: 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
eae0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
eaf0: 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
eb00: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
eb10: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
eb20: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
eb30: 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  nct;..  /* Trans
eb40: 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65 78  fer the limit ex
eb50: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
eb60: 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74 68  e subquery to th
eb70: 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
eb80: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ry..  */.  if( p
eb90: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29  Sub->nLimit>=0 )
eba0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69  {.    if( p->nLi
ebb0: 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  mit<0 ){.      p
ebc0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
ebd0: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c  >nLimit;.    }el
ebe0: 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  se if( p->nLimit
ebf0: 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53  +p->nOffset > pS
ec00: 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d  ub->nLimit+pSub-
ec10: 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >nOffset ){.    
ec20: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53    p->nLimit = pS
ec30: 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75  ub->nLimit + pSu
ec40: 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e  b->nOffset - p->
ec50: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20  nOffset;.    }. 
ec60: 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20   }.  p->nOffset 
ec70: 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  += pSub->nOffset
ec80: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  ;..  /* Finially
ec90: 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
eca0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
ecb0: 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
ecc0: 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
ecd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
ece0: 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b  ectDelete(pSub);
ecf0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
ed00: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
ed10: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ed20: 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  nt passed in as 
ed30: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
ed40: 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
ed50: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
ed60: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49   max() query.  I
ed70: 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73  f it is and this
ed80: 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a   query can be.**
ed90: 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
eda0: 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74   a single seek t
edb0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
edc0: 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64  or end of an ind
edd0: 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65  ex,.** then gene
ede0: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f  rate the code fo
edf0: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e  r this SELECT an
ee00: 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  d return 1.  If 
ee10: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a  this is not a .*
ee20: 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  * simple min() o
ee30: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74  r max() query, t
ee40: 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a  hen return 0;.**
ee50: 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e  .** A simply min
ee60: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
ee70: 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  y looks like thi
ee80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
ee90: 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74  CT min(a) FROM t
eea0: 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  able;.**    SELE
eeb0: 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  CT max(a) FROM t
eec0: 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able;.**.** The 
eed0: 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f  query may have o
eee0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
eef0: 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61  le in its FROM a
ef00: 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a  rgument.  There.
ef10: 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f  ** can be no GRO
ef20: 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
ef30: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
ef40: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  .  The result se
ef50: 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  t must.** be the
ef60: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
ef70: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  of a single colu
ef80: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
ef90: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20    The column.** 
efa0: 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  in the min() or 
efb0: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  max() function m
efc0: 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a  ust be indexed..
efd0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
efe0: 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75  ters to this rou
eff0: 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d  tine are the sam
f000: 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33  e as for sqlite3
f010: 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65  Select()..** See
f020: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
f030: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
f040: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
f050: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
f060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69  */.static int si
f070: 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
f080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f090: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44  elect *p, int eD
f0a0: 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b  est, int iParm){
f0b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
f0c0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61    int iCol;.  Ta
f0d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
f0e0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
f0f0: 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  base;.  Vdbe *v;
f100: 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20  .  int seekOp;. 
f110: 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70   int cont;.  Exp
f120: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a  rList *pEList, *
f130: 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20  pList, eList;.  
f140: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f150: 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
f160: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
f170: 0a 20 20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .  ..  /* Check 
f180: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
f190: 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
f1a0: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f1b0: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
f1c0: 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
f1d0: 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
f1e0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
f1f0: 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
f200: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
f210: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
f220: 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53  ->pSrc;.  if( pS
f230: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
f240: 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
f250: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
f260: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
f270: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
f280: 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
f290: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
f2a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
f2b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
f2c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c  ) return 0;.  pL
f2d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
f2e0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  st;.  if( pList=
f2f0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
f300: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
f310: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
f320: 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
f330: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
f340: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
f350: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
f360: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
f370: 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
f380: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
f390: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
f3a0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
f3b0: 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
f3c0: 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
f3d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f3e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
f3f0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
f400: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
f410: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
f420: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
f430: 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
f440: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
f450: 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
f460: 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
f470: 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
f480: 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
f490: 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
f4a0: 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
f4b0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
f4c0: 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
f4d0: 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
f4e0: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
f4f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
f500: 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
f510: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
f520: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
f530: 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
f540: 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
f550: 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
f560: 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
f570: 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
f580: 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
f590: 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
f5a0: 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
f5b0: 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
f5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
f5d0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
f5e0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f5f0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f600: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f610: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
f620: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
f630: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
f640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f650: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
f660: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
f670: 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
f680: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
f690: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
f6a0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
f6b0: 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
f6c0: 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
f6d0: 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
f6e0: 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
f6f0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
f700: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
f710: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
f720: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
f730: 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
f740: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
f750: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f760: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f770: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
f780: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
f790: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
f7a0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
f7b0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
f7c0: 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73  ->pSrc, p->pELis
f7d0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
f7e0: 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
f7f0: 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
f800: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
f810: 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
f820: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
f830: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
f840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
f860: 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
f870: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
f880: 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
f890: 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
f8a0: 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
f8b0: 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
f8c0: 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
f8d0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
f8e0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
f8f0: 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
f900: 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
f910: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f920: 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
f930: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
f940: 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
f950: 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
f960: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
f970: 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
f980: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
f990: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
f9a0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61  pTab->iDb);.  ba
f9b0: 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  se = pSrc->a[0].
f9c0: 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75  iCursor;.  compu
f9d0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
f9e0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
f9f0: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
fa00: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
fa10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fa30: 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  pTab->iDb, 0);. 
fa40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
fa50: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
fa60: 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e  , base, pTab->tn
fa70: 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  um, pTab->zName,
fa80: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20   0);.  }.  cont 
fa90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
faa0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
fab0: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
fac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fad0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
fae0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
faf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb00: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
fb10: 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
fb20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fb30: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
fb40: 65 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  ead, base+1, pId
fb50: 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 7a  x->tnum, pIdx->z
fb60: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
fb70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fb80: 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
fb90: 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
fba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbb0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e  Op(v, OP_IdxRecn
fbc0: 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20  o, base+1, 0);. 
fbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbe0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
fbf0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
fc00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc10: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
fc20: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
fc30: 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
fc40: 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
fc50: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
fc60: 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
fc70: 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
fc80: 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
fc90: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
fca0: 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
fcb0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
fcc0: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
fcd0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
fce0: 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20   cont, cont);.  
fcf0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
fd00: 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
fd10: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
fd20: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
fd30: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20  , base, 0);.  . 
fd40: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
fd50: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
fd60: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
fd70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fd80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
fd90: 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
fda0: 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
fdb0: 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
fdc0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
fdd0: 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
fde0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
fdf0: 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
fe00: 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
fe50: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
fe60: 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
fe70: 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
fe80: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
fe90: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
fea0: 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
feb0: 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
fec0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
fed0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
fee0: 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
fef0: 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
ff00: 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68   of a table with
ff10: 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a   cursor iParm.**
ff20: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
ff30: 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
ff40: 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
ff50: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
ff60: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
ff70: 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
ff80: 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
ff90: 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
ffa0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
ffb0: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
ffc0: 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
ffd0: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
ffe0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
fff0: 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
10000 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
10010 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
10020 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
10030 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
10040 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
10050 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
10060 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
10070 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
10080 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
10090 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
100a0 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
100b0 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
100c0 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
100d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
100e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
100f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
10100 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
10110 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
10120 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
10130 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
10140 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
10150 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
10160 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
10170 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
10180 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
10190 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
101a0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
101b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
101c0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
101d0 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
101e0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
101f0 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
10200 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
10210 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
10220 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
10230 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
10240 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
10250 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
10260 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
10270 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
10280 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
10290 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
102a0 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
102b0 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
102c0 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
102d0 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
102e0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
102f0 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
10300 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
10310 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
10320 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
10330 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
10340 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
10350 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
10360 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
10370 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
10380 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
10390 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
103a0 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
103b0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
103c0 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
103d0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
103e0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
103f0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
10400 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
10410 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
10450 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
10460 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
10470 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
10480 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
10490 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
104a0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
104b0 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
104c0 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
104d0 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
104e0 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
104f0 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
10500 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
10510 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
10520 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10530 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
10540 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
10550 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
10560 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
10570 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
10580 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
10590 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
105a0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
105b0 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
105c0 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
105d0 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
105e0 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
105f0 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
10600 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
10610 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
10620 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
10630 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
10640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10660 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10670 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
10680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10690 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
106a0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
106b0 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
106c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
106d0 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
106e0 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
106f0 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
10700 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
10710 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
10720 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
10730 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
10740 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
10750 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
10760 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
10770 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
10780 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
10790 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
107a0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
107b0 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
107c0 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
107d0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20   *pParentAgg    
107e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
107f0 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
10800 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
10810 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
10820 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
10830 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  fo;.  Vdbe *v;. 
10840 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20   int isAgg = 0; 
10850 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10860 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
10870 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
10880 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10890 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
108a0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
108b0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
108c0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
108d0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
108e0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
108f0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
10900 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
10910 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
10920 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
10930 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
10940 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
10950 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
10960 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
10970 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
10980 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
10990 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
109a0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
109b0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
109c0 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
109d0 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
109e0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
109f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
10a00 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
10a10 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10a20 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
10a30 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
10a40 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
10a50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
10a60 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
10a70 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
10a80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
10a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10aa0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
10ab0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
10ac0 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  n */..  if( sqli
10ad0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
10ae0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
10af0 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75  r || p==0 ) retu
10b00 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
10b10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10b20 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
10b30 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
10b40 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49  eturn 1;..  /* I
10b50 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
10b60 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
10b70 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
10b80 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
10b90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
10ba0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
10bb0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
10bc0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
10bd0 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
10be0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
10bf0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
10c00 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
10c10 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
10c20 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
10c30 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
10c40 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65  >pWhere;.  pOrde
10c50 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
10c60 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  y;.  pGroupBy = 
10c70 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
10c80 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
10c90 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
10ca0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
10cb0 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
10cc0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66  e VDBE cursors f
10cd0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
10ce0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10cf0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
10d00 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
10d10 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
10d20 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  List);..  /* .  
10d30 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
10d40 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
10d50 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
10d60 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
10d70 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
10d80 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
10d90 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
10da0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10db0 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
10dc0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45  ect_end;..  /* E
10dd0 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65  xpand any "*" te
10de0 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  rms in the resul
10df0 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61  t set.  (For exa
10e00 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a  mple the "*" in.
10e10 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    ** "SELECT * F
10e20 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66 69  ROM t1")  The fi
10e30 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29  llInColumnlist()
10e40 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
10e50 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68  es some.  ** oth
10e60 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20  er housekeeping 
10e70 2d 20 73 65 65 20 74 68 65 20 68 65 61 64 65 72  - see the header
10e80 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74   comment for det
10e90 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ails..  */.  if(
10ea0 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
10eb0 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
10ec0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10ed0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72  end;.  }.  pWher
10ee0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
10ef0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
10f00 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
10f10 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
10f20 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
10f30 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
10f40 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
10f50 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
10f60 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
10f70 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
10f80 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73    */.  if( (eDes
10f90 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
10fa0 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26  est==SRT_Set) &&
10fb0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31   pEList->nExpr>1
10fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10fd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10fe0 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
10ff0 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
11000 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
11010 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
11020 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
11030 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  on");.    goto s
11040 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
11050 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
11060 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
11070 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
11080 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65    */.  switch( e
11090 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
110a0 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20   SRT_Union:.    
110b0 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
110c0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
110d0 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72  scard:.      pOr
110e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
110f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
11100 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
11110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
11120 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68  his point, we sh
11130 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61  ould have alloca
11140 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73  ted all the curs
11150 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  ors that we.  **
11160 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20   need to handle 
11170 73 75 62 71 75 65 72 79 73 20 61 6e 64 20 74 65  subquerys and te
11180 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
11190 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f   .  **.  ** Reso
111a0 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  lve the column n
111b0 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65  ames and do a se
111c0 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e  mantics check on
111d0 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
111e0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
111f0 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
11200 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11210 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11220 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11230 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
11240 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11250 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
11260 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11270 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11280 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
11290 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
112a0 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41  ].pExpr, 1, &isA
112b0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
112c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
112d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
112e0 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20  here ){.    if( 
112f0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
11300 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
11310 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
11320 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  pWhere) ){.     
11330 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11350 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
11360 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
11370 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
11380 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
113a0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
113b0 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
113c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
113e0 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
113f0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
11400 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
11410 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
11420 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
11430 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11440 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
11450 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
11460 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
11470 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11480 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
114a0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
114b0 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73 41  pHaving, 1, &isA
114c0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
114d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
114e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f    }.  }.  if( pO
114f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f  rderBy ){.    fo
11500 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
11510 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
11520 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
11530 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
11540 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11550 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
11560 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11570 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
11580 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43   && iCol>0 && iC
11590 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol<=pEList->nExp
115a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
115b0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
115c0 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
115d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
115e0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
115f0 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
11600 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b  [iCol-1].pExpr);
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11620 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
11630 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11640 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11650 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
11660 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11670 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11680 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11690 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
116a0 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
116b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
116c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
116d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
116e0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
116f0 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pE) ){.        i
11700 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11710 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
11720 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
11730 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11740 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11750 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
11760 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
11770 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
11780 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20  constants");.   
11790 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
117a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
117b0 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d  }else if( iCol<=
117c0 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
117d0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
117e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
117f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
11800 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
11810 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  R BY column numb
11820 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
11830 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
11840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
11850 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
11860 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
11870 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
11880 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11890 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
118a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
118b0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
118c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
118d0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
118e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
118f0 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70   iCol;.      Exp
11900 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79  r *pE = pGroupBy
11910 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11920 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11930 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11940 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
11950 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
11960 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11970 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
11980 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20  elete(pE);.     
11990 20 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79     pE = pGroupBy
119a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
119b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
119c0 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
119d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
119e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
119f0 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
11a00 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11a10 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
11a20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11a30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11a40 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
11a50 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
11a60 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20  rse, pE, isAgg, 
11a70 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  0) ){.        go
11a80 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11aa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
11ab0 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
11ac0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ad0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11ae0 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a  E, &iCol)==0 ){.
11af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11b00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 47  ,.            "G
11b20 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75  ROUP BY terms mu
11b30 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
11b40 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
11b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
11b60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11b70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11b80 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
11b90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
11ba0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11bb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11bc0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
11bd0 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e  "GROUP BY column
11be0 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
11bf0 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
11c00 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
11c10 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
11c20 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c  d %d", iCol, pEL
11c30 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
11c40 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11c50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
11c60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11c70 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
11c80 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
11c90 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
11ca0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11cb0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
11cc0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11cd0 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
11ce0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
11cf0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
11d00 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
11d10 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
11d20 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
11d30 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
11d40 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
11d50 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
11d60 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  n..  */.  if( eD
11d70 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
11d80 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
11d90 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
11da0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
11db0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
11dc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11dd0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
11de0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
11df0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  clause.  */.  fo
11e00 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
11e10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
11e20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11e30 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
11e40 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65  ;.    int needRe
11e50 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20  storeContext;.. 
11e60 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
11e70 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
11e80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11e90 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
11ea0 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  [i].zName!=0 ){.
11eb0 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68        zSavedAuth
11ec0 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
11ed0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
11ee0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
11ef0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61  uthContext = pTa
11f00 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
11f10 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e;.      needRes
11f20 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b  toreContext = 1;
11f30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11f40 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
11f50 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  text = 0;.    }.
11f60 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
11f70 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
11f80 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
11f90 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c  , SRT_TempTable,
11fa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11fb0 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
11fc0 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c  ].iCursor, p, i,
11fd0 20 26 69 73 41 67 67 29 3b 0a 20 20 20 20 69 66   &isAgg);.    if
11fe0 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
11ff0 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
12000 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
12010 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
12020 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
12030 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
12040 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
12050 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
12060 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
12070 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21  _Union && eDest!
12080 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65  =SRT_Except && e
12090 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72  Dest!=SRT_Discar
120a0 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  d ){.      pOrde
120b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
120c0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
120d0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
120e0 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
120f0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
12100 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
12110 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
12120 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
12130 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
12140 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
12150 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
12160 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
12170 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
12180 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
12190 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
121a0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
121b0 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
121c0 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
121d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
121e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
121f0 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
12200 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
12210 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
12220 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
12230 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
12240 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
12250 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
12260 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
12270 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ely.  .  */.  if
12280 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
12290 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
122a0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
122b0 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
122c0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
122d0 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
122e0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
122f0 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
12300 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
12310 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
12320 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
12330 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
12340 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
12350 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 64  se, p);..  /* Id
12360 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
12370 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
12380 65 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 62 61  e using a callba
12390 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
123a0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
123b0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
123c0 67 6f 69 6e 67 20 74 6f 20 61 20 64 65 73 74 69  going to a desti
123d0 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20 20 2a  nation other.  *
123e0 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c 62 61 63  * than a callbac
123f0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  k..  **.  ** We 
12400 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
12410 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d 20  separately from 
12420 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
12430 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
12440 2a 20 61 62 6f 76 65 20 62 65 63 61 75 73 65 20  * above because 
12450 69 66 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  if the pTabList 
12460 63 6f 6e 74 61 69 6e 73 20 76 69 65 77 73 20 74  contains views t
12470 68 65 6e 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f  hen they will no
12480 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
12490 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 77 65   resolved and we
124a0 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
124b0 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  he column types 
124c0 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  until.  ** now..
124d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
124e0 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
124f0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
12500 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
12510 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
12520 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
12530 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
12540 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
12550 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
12560 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
12570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12580 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
12590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
125a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
125b0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
125c0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  0);.  }..  /* Do
125d0 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
125e0 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
125f0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
12600 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
12610 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
12620 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70    if( isAgg || p
12630 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61  GroupBy ){.    a
12640 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
12650 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73  Agg==0 );.    is
12660 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  Agg = 1;.    for
12670 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
12680 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12690 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
126a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
126b0 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  tes(pParse, pELi
126c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
126d0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
126e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
126f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12700 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
12710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12720 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
12730 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
12740 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
12750 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12760 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
12770 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
12780 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
12790 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
127a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
127b0 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
127c0 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
127d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
127e0 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  es(pParse, pHavi
127f0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
12800 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12810 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
12820 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
12830 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
12840 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
12850 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
12860 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
12870 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
12880 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
12890 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
128a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
128b0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
128c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
128d0 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
128e0 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f   aggregator.  */
128f0 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
12900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12910 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
12920 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
12930 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
12940 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
12950 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
12960 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
12970 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
12980 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
12990 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
129a0 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
129b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
129c0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
129d0 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20   OP_AggInit, 0, 
129e0 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c  i, (char*)pFunc,
129f0 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
12a00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12a10 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
12a20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12a40 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
12a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12a60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
12a70 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ocus, 0, 0);.   
12a80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
12a90 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
12aa0 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a  ry cell to NULL.
12ab0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12ac0 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20  ==SRT_Mem ){.   
12ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ae0 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12af0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12b00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12b10 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
12b20 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
12b30 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
12b40 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
12b50 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
12b60 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
12b70 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
12b80 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
12b90 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
12ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12bb0 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
12bc0 2c 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a  , distinct, 1);.
12bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
12be0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
12bf0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
12c00 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
12c10 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  */.  pWInfo = sq
12c20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12c30 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12c40 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20  , pWhere, 0, .  
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70            pGroup
12c70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72  By ? 0 : &pOrder
12c80 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  By);.  if( pWInf
12c90 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
12ca0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
12cb0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
12cc0 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
12cd0 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
12ce0 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
12cf0 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
12d00 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
12d10 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
12d20 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
12d30 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
12d40 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
12d50 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
12d60 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
12d70 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
12d80 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
12d90 61 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ak) ){.       go
12da0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12db0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
12dc0 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
12dd0 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73   with aggregates
12de0 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70  , then do the sp
12df0 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a  ecial aggregate.
12e00 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e    ** processing.
12e10 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a    .  */.  else{.
12e20 20 20 20 20 41 67 67 45 78 70 72 20 2a 70 41 67      AggExpr *pAg
12e30 67 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  g;.    if( pGrou
12e40 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
12e50 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72   lbl1;.      for
12e60 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
12e70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12e90 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12ea0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
12eb0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
12ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ed0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  ddOp(v, OP_MakeK
12ee0 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ey, pGroupBy->nE
12ef0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  xpr, 0);.      i
12f00 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
12f10 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20  ile_format>=4 ) 
12f20 73 71 6c 69 74 65 33 41 64 64 4b 65 79 54 79 70  sqlite3AddKeyTyp
12f30 65 28 76 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  e(v, pGroupBy);.
12f40 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
12f50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12f60 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
12f70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12f80 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
12f90 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  lbl1);.      for
12fa0 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73  (i=0, pAgg=pPars
12fb0 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73  e->aAgg; i<pPars
12fc0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41  e->nAgg; i++, pA
12fd0 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  gg++){.        i
12fe0 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29  f( pAgg->isAgg )
12ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13000 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13010 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d  de(pParse, pAgg-
13020 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
13030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13040 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
13050 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, i);.      }. 
13060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13070 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13080 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
13090 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
130a0 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
130b0 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
130c0 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
130d0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
130e0 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
130f0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
13100 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
13110 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
13120 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
13130 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30  ( pAgg->pFunc!=0
13140 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13150 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78  ( pAgg->pFunc->x
13160 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
13170 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46   pDef = pAgg->pF
13180 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  unc;.      pE = 
13190 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAgg->pExpr;.   
131a0 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
131b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
131c0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
131d0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
131e0 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
131f0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
13200 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
13210 4c 69 73 74 2c 20 70 44 65 66 2d 3e 69 6e 63 6c  List, pDef->incl
13220 75 64 65 54 79 70 65 73 29 3b 0a 20 20 20 20 20  udeTypes);.     
13230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13240 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
13250 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
13260 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13270 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e  OP_AggFunc, 0, n
13280 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65  Expr, (char*)pDe
13290 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  f, P3_POINTER);.
132a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
132b0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
132c0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
132d0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
132e0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
132f0 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63  * If we are proc
13300 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
13310 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65  s, we need to se
13320 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f  t up a second lo
13330 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c  op.  ** over all
13340 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
13350 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f  e values and pro
13360 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a  cess them..  */.
13370 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
13380 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20     int endagg = 
13390 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
133a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
133b0 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73   startagg;.    s
133c0 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65  tartagg = sqlite
133d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
133e0 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64  _AggNext, 0, end
133f0 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65  agg);.    pParse
13400 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20  ->useAgg = 1;.  
13410 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
13420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13430 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
13440 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
13450 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
13460 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
13470 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
13480 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
13490 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
134a0 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
134c0 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
134d0 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20  endagg) ){.     
134e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
134f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13500 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13510 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72  OP_Goto, 0, star
13520 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tagg);.    sqlit
13530 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13540 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
13550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13560 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
13570 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
13580 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
13590 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
135a0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
135b0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
135c0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
135d0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
135e0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
135f0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
13600 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
13610 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
13620 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
13630 54 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73  Tail(p, v, pELis
13640 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
13650 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
13660 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
13670 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61   subquery, we ha
13680 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64  ve now converted
13690 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
136a0 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  to a.  ** tempor
136b0 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64  ary table.  So d
136c0 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65  elete the subque
136d0 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ry structure fro
136e0 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  m the parent.  *
136f0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  * to prevent thi
13700 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
13710 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
13720 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
13730 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  ce the.  ** the 
13740 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  use of the tempo
13750 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
13760 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
13770 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
13780 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
13790 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
137a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
137b0 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
137c0 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
137d0 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
137e0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b  SelectDelete(p);
137f0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
13800 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
13810 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
13820 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  }..  /* The SELE
13830 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
13840 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
13850 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
13860 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
13870 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
13880 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
13890 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
138a0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
138b0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
138c0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
138d0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
138e0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
138f0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
13900 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
13910 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
13920 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
13930 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13940 0a 0a 0a 0a                                      ....