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

Artifact 43cc2a76e3e00dabc59da82d0dcdef23cdba43a3:


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 32 34 37  select.c,v 1.247
0200: 20 32 30 30 35 2f 30 35 2f 31 39 20 30 38 3a 34   2005/05/19 08:4
0210: 33 3a 30 30 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:00 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 45 78 70 72 20 2a 70 4c 69  t */.  Expr *pLi
0450: 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  mit,         /* 
0460: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55  LIMIT value.  NU
0470: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65  LL means not use
0480: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66  d */.  Expr *pOf
0490: 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  fset         /* 
04a0: 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e  OFFSET value.  N
04b0: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66  ULL means no off
04c0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  set */.){.  Sele
04d0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04f0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0500: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f 66  ;.  assert( !pOf
0510: 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29  fset || pLimit )
0520: 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61 76  ;   /* Can't hav
0530: 65 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75 74  e OFFSET without
0540: 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28   LIMIT. */.  if(
0550: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
0560: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0570: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
0580: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
0590: 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20  tDelete(pSrc);. 
05a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
05b0: 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20  lete(pWhere);.  
05c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
05d0: 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70 42 79  tDelete(pGroupBy
05e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
05f0: 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e 67  prDelete(pHaving
0600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
0610: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
0620: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
0630: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c  te3ExprDelete(pL
0640: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
0650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4f 66  e3ExprDelete(pOf
0660: 66 73 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fset);.  }else{.
0670: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d      if( pEList==
0680: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69 73  0 ){.      pELis
0690: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
06a0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71 6c  istAppend(0, sql
06b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c  ite3Expr(TK_ALL,
06c0: 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 20 20  0,0,0), 0);.    
06d0: 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69  }.    pNew->pELi
06e0: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
06f0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
0700: 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  rc;.    pNew->pW
0710: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0720: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
0730: 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
0740: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
0750: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70  = pHaving;.    p
0760: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0770: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e  pOrderBy;.    pN
0780: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
0790: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20   isDistinct;.   
07a0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
07b0: 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d  ELECT;.    pNew-
07c0: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
07d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66  ;.    pNew->pOff
07e0: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
07f0: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
0800: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0810: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
0820: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0840: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0850: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0860: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0870: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0880: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0890: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
08a0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
08b0: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
08c0: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
08d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
08e0: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
08f0: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0900: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0910: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0920: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0930: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0940: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0950: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0960: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0970: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0980: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0990: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
09a0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
09b0: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
09c0: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
09d0: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
09e0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
09f0: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0a00: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0a10: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0a20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0a30: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0a40: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0a50: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0a60: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0a70: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0a80: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0a90: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0aa0: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 77 6f  nst char *zKeywo
0ab0: 72 64 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72  rd;.    u8 nChar
0ac0: 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20  ;.    u8 code;. 
0ad0: 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20   } keywords[] = 
0ae0: 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c  {.    { "natural
0af0: 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ", 7, JT_NATURAL
0b00: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22   },.    { "left"
0b10: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0b20: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0b30: 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20  { "right",   5, 
0b40: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0b50: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c  R },.    { "full
0b60: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0b70: 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54  |JT_RIGHT|JT_OUT
0b80: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74  ER },.    { "out
0b90: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54  er",   5, JT_OUT
0ba0: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e  ER },.    { "inn
0bb0: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  er",   5, JT_INN
0bc0: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f  ER },.    { "cro
0bd0: 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  ss",   5, JT_INN
0be0: 45 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  ER },.  };.  int
0bf0: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
0c00: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
0c10: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
0c20: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
0c30: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
0c40: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
0c50: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
0c60: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a    for(j=0; j<siz
0c70: 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69  eof(keywords)/si
0c80: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d  zeof(keywords[0]
0c90: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
0ca0: 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64  f( p->n==keyword
0cb0: 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  s[j].nChar .    
0cc0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
0cd0: 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b  StrNICmp(p->z, k
0ce0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77  eywords[j].zKeyw
0cf0: 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b  ord, p->n)==0 ){
0d00: 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  .        jointyp
0d10: 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  e |= keywords[j]
0d20: 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62  .code;.        b
0d30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
0d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73    }.    if( j>=s
0d50: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f  izeof(keywords)/
0d60: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b  sizeof(keywords[
0d70: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  0]) ){.      joi
0d80: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
0d90: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
0da0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
0db0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
0dc0: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
0dd0: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
0de0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
0df0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
0e00: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
0e10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0e20: 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp1 = " ";.   
0e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
0e40: 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69 66 28  2 = " ";.    if(
0e50: 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31 2b 2b   pB==0 ){ zSp1++
0e60: 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43 3d 3d  ; }.    if( pC==
0e70: 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d 0a 20  0 ){ zSp2++; }. 
0e80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
0e90: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
0ea0: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
0eb0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
0ec0: 20 20 20 20 20 20 20 22 25 54 25 73 25 54 25 73         "%T%s%T%s
0ed0: 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c 20 70  %T", pA, zSp1, p
0ee0: 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a 20 20  B, zSp2, pC);.  
0ef0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0f00: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
0f10: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
0f20: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
0f30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f40: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
0f50: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
0f60: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
0f70: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
0f80: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
0f90: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0fa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
0fb0: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
0fc0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
0fd0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
0fe0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
0ff0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
1000: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
1010: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
1020: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1030: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1040: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1050: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1060: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1070: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1080: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1090: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
10a0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
10b0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
10c0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
10d0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
10e0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
10f0: 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20  of a token to a 
1100: 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65  '\000'-terminate
1110: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  d string..*/.sta
1120: 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65  tic void setToke
1130: 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  n(Token *p, cons
1140: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d  t char *z){.  p-
1150: 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d 3e 6e 20 3d  >z = z;.  p->n =
1160: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 70 2d   strlen(z);.  p-
1170: 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  >dyn = 0;.}.../*
1180: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
1190: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
11a0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
11b0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
11c0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
11d0: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
11e0: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
11f0: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1210: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1230: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1240: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1250: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1260: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1270: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
1280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1290: 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c  lias1,     /* Al
12a0: 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61  ias for first ta
12b0: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
12c0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  L */.  const Tab
12d0: 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20  le *pTab2,      
12e0: 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20  /* Second table 
12f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1300: 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a  *zAlias2,     /*
1310: 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e   Alias for secon
1320: 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65  d table.  May be
1330: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1340: 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20  **ppExpr        
1350: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1360: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1370: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1380: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  */.){.  Token du
1390: 6d 6d 79 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  mmy;.  Expr *pE1
13a0: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
13b0: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
13c0: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
13d0: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 73 65 74 54  xpr *pE;..  setT
13e0: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 43 6f  oken(&dummy, zCo
13f0: 6c 29 3b 0a 20 20 70 45 31 61 20 3d 20 73 71 6c  l);.  pE1a = sql
1400: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
1410: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  0, 0, &dummy);. 
1420: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 45   pE2a = sqlite3E
1430: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1440: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20   &dummy);.  if( 
1450: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
1460: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
1470: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
1480: 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c  setToken(&dummy,
1490: 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 70 45 31   zAlias1);.  pE1
14a0: 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  b = sqlite3Expr(
14b0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
14c0: 6d 6d 79 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  mmy);.  if( zAli
14d0: 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as2==0 ){.    zA
14e0: 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a  lias2 = pTab2->z
14f0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 73 65 74 54  Name;.  }.  setT
1500: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 41 6c  oken(&dummy, zAl
1510: 69 61 73 32 29 3b 0a 20 20 70 45 32 62 20 3d 20  ias2);.  pE2b = 
1520: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1530: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1540: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
1550: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
1560: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1570: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1580: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62  xpr(TK_DOT, pE2b
1590: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
15a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
15b0: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
15c0: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
15d0: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
15e0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70 70 45  romJoin);.  *ppE
15f0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1600: 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45  rAnd(*ppExpr, pE
1610: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1620: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
1630: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
1640: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1650: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1660: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1670: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1680: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
1690: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
16a0: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
16b0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
16c0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
16d0: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
16e0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
16f0: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
1700: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
1710: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1720: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
1730: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
1740: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
1750: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
1760: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
1770: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
1780: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
1790: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
17a0: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
17b0: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
17c0: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
17d0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
17e0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
17f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1800: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
1810: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  p){.  while( p )
1820: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
1830: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
1840: 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74 4a 6f  Join);.    setJo
1850: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  inExpr(p->pLeft)
1860: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
1870: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
1880: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1890: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
18a0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
18b0: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
18c0: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
18d0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
18e0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
18f0: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
1900: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1910: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
1920: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
1930: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
1940: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
1950: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
1960: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
1970: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1980: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
1990: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
19a0: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
19b0: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
19c0: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
19d0: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
19e0: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
19f0: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
1a00: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1a10: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
1a20: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
1a30: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
1a40: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
1a50: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
1a60: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
1a70: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
1a80: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
1a90: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
1aa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ab0: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
1ac0: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
1ad0: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
1ae0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1af0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1b00: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1b10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
1b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1b30: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
1b40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1b50: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
1b60: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1b80: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
1b90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1ba0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1bd0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1be0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
1bf0: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
1c00: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
1c10: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
1c20: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
1c30: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
1c40: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
1c50: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
1c60: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
1c70: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
1c80: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
1c90: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
1ca0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
1cb0: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
1cc0: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
1cd0: 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20  ble *pLeftTab = 
1ce0: 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20  pLeft->pTab;.   
1cf0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
1d00: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
1d10: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
1d20: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
1d30: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
1d40: 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
1d50: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1d60: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
1d70: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
1d80: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
1d90: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
1da0: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
1db0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
1dc0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1dd0: 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70  ( pLeft->jointyp
1de0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
1df0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  {.      if( pLef
1e00: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66 74 2d  t->pOn || pLeft-
1e10: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
1e20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1e30: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
1e40: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
1e50: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
1e60: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
1e70: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
1e80: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1ea0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65    for(j=0; j<pLe
1eb0: 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ftTab->nCol; j++
1ec0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ed0: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61  *zName = pLeftTa
1ee0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1ef0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1f00: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
1f10: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
1f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
1f30: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
1f40: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
1f50: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
1f80: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
1f90: 73 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  s, &p->pWhere);.
1fa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1fc0: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
1fd0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1fe0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
1ff0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2000: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
2010: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
2020: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2030: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2040: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2050: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2060: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2070: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2080: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2090: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
20a0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
20b0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
20c0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
20d0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
20e0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
20f0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2100: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2110: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
2120: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
2130: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  >pOn);.      p->
2140: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2150: 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72  ExprAnd(p->pWher
2160: 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a  e, pLeft->pOn);.
2170: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f 6e        pLeft->pOn
2180: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2190: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
21a0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
21b0: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
21c0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
21d0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
21e0: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
21f0: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
2200: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
2210: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
2220: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
2230: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
2240: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2250: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2260: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2270: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2280: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2290: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
22a0: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
22b0: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
22c0: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
22d0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
22e0: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
22f0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
2300: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
2310: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
2320: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55 73    if( pLeft->pUs
2330: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
2340: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c 65  ist *pList = pLe
2350: 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ft->pUsing;.    
2360: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
2370: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
2380: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2390: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
23a0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
23b0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
23c0: 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29  pLeftTab, zName)
23d0: 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65  <0 || columnInde
23e0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
23f0: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
2400: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2410: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
2420: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
2430: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
2440: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
2450: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2460: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61  oth tables", zNa
2470: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  me);.          r
2480: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2490: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
24a0: 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70  ereTerm(zName, p
24b0: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
24c0: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
24f0: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 20  pRight->zAlias, 
2500: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2510: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2520: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2530: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
2540: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
2550: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
2560: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
2570: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2580: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2590: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
25a0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
25b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
25c0: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
25d0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
25e0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  cListDelete(p->p
25f0: 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Src);.  sqlite3E
2600: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
2610: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
2620: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
2630: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
2640: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2650: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
2660: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2670: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2680: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2690: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
26a0: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
26b0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
26c0: 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  it);.  sqlite3Ex
26d0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66  prDelete(p->pOff
26e0: 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  set);.  sqliteFr
26f0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
2700: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
2710: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
2720: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
2730: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
2740: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
2750: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
2760: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
2770: 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a  toSorter(Parse *
2780: 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c  pParse, Vdbe *v,
2790: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
27a0: 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rBy){.  int i;. 
27b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
27c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
27d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
27e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
27f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2800: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xpr);.  }.  sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
2830: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2840: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2860: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
2880: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2890: 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54  OFFSET and LIMIT
28a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28b0: 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20 20 56  codeLimiter(.  V
28c0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
28d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
28e0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
28f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2910: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2920: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
2930: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2940: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2950: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
2960: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  t record */.  in
2970: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
2980: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2990: 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  end the loop */.
29a0: 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20    int nPop      
29b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29c0: 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74   times to pop st
29d0: 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67  ack when jumping
29e0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
29f0: 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20  iOffset>=0 ){.  
2a00: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2a10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2a20: 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20  ddr(v) + 3;.    
2a30: 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64  if( nPop>0 ) add
2a40: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r++;.    sqlite3
2a50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2a60: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
2a70: 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
2a80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2a90: 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 2d   OP_IfMemPos, p-
2aa0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 29 3b  >iOffset, addr);
2ab0: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
2ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ae0: 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20  Pop, nPop, 0);. 
2af0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2b00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2b10: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
2b20: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
2b30: 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70  ment((v, "# skip
2b40: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
2b50: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2b60: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
2b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b80: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2b90: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
2ba0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
2bb0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 78 69  mment((v, "# exi
2bc0: 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 72 65 61  t when LIMIT rea
2bd0: 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  ched"));.  }.}..
2be0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bf0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
2c00: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
2c10: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
2c20: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
2c30: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
2c40: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
2c50: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
2c60: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
2c70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
2c80: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
2c90: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2ca0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
2cb0: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
2cc0: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
2cd0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
2ce0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
2cf0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
2d00: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
2d10: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
2d20: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
2d30: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
2d40: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
2d50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2d60: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2d70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2d80: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2d90: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
2da0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
2db0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2dc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2dd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
2de0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
2df0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
2e00: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e20: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
2e30: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2e40: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
2e50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2e70: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2e80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2e90: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
2ea0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
2eb0: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
2ec0: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
2ed0: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
2ee0: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
2ef0: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
2f00: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
2f10: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f30: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
2f40: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
2f50: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2f70: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2f80: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
2f90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
2fa0: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
2fb0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
2fc0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
2fd0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
2fe0: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
2ff0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3000: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
3010: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
3020: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
3030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
3040: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
3050: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
3060: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
3070: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
3080: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
3090: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30b0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
30c0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
30d0: 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  nt */..  if( v==
30e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
30f0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
3100: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
3110: 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20  ere was a LIMIT 
3120: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45  clause on the SE
3130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
3140: 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63  then do the chec
3150: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
3160: 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64   this row should
3170: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
3180: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
3190: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20   distinct>=0 && 
31a0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
31b0: 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28  ->nExpr>0;.  if(
31c0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
31d0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
31e0: 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28      codeLimiter(
31f0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
3200: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 7d   iBreak, 0);.  }
3210: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
3220: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
3230: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
3240: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
3250: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
3260: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
3270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3280: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
3290: 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  cTab, i);.    }.
32a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
32b0: 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  lumn = pEList->n
32c0: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
32d0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
32e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
32f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
3300: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
3310: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3320: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3330: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3340: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3350: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3360: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3370: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3380: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
3390: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
33a0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
33b0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
33c0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
33d0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 23 69  asDistinct ){.#i
33e0: 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  f NULL_ALWAYS_DI
33f0: 53 54 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74  STINCT.    sqlit
3400: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3410: 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73  P_IsNull, -pELis
3420: 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65  t->nExpr, sqlite
3430: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3440: 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20  (v)+7);.#endif. 
3450: 20 20 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65     /* Deliberate
3460: 6c 79 20 6c 65 61 76 65 20 74 68 65 20 61 66 66  ly leave the aff
3470: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66  inity string off
3480: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3490: 67 0a 20 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65  g.    ** OP_Make
34a0: 52 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71  Record */.    sq
34b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
34c0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
34d0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2a   pEList->nExpr *
34e0: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c   -1, 0);.    sql
34f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3500: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69   OP_Distinct, di
3510: 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 33 56  stinct, sqlite3V
3520: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3530: 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )+3);.    sqlite
3540: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3550: 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  _Pop, pEList->nE
3560: 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  xpr+1, 0);.    s
3570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3580: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3590: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
35a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
35b0: 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63  # skip indistinc
35c0: 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  t records"));.  
35d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
35f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
3600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3610: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64   OP_PutStrKey, d
3620: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
3630: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3640: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4c 69   ){.      codeLi
3650: 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e  miter(v, p, iCon
3660: 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20 6e  tinue, iBreak, n
3670: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
3680: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
3690: 65 73 74 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  est ){.#ifndef S
36a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
36b0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 2f  UND_SELECT.    /
36c0: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
36d0: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
36e0: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
36f0: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
3700: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
3710: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3720: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
3730: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n: {.      sqlit
3740: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3750: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3760: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3770: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3790: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
37a0: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
37b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
37d0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
37e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37f0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
3800: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
3810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
3830: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
3840: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
3850: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
3860: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
3870: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
3880: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
3890: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
38a0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
38b0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
38c0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
38d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
38e0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ept: {.      int
38f0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
3900: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3910: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3920: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3930: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
3940: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  INCT);.      sql
3950: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
3960: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
3970: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3990: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
39a0: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
39b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
39c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
39d0: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
39e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
39f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
3a00: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
3a10: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
3a20: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
3a30: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3a40: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
3a50: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
3a60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3a70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3a80: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
3a90: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3aa0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3ab0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3ac0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3ad0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3b00: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
3b10: 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  o, iParm, 0);.  
3b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3b30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
3b40: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
3b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3b60: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
3b70: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
3b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3b90: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
3ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
3bb0: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
3bc0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
3bd0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3be0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3bf0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3c00: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3c10: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3c20: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3c30: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3c40: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3c50: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3c60: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3c70: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3c80: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3c90: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3ca0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3cb0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3cc0: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3ce0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d00: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3d10: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3d20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3d30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3d40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3d50: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3d60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3d70: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3d80: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3d90: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3da0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3db0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3dd0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3de0: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3df0: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3e00: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3e10: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3e20: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3e40: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3e50: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3e60: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3e80: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3e90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3eb0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3ec0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
3ed0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
3ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ef0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3f00: 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  r2, sqlite3VdbeC
3f10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
3f20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
3f40: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
3f50: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
3f60: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
3f70: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
3f80: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
3f90: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
3fa0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
3fb0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
3fc0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3fd0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
3fe0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
3ff0: 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52  sts:.    case SR
4000: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
4010: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4020: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
4030: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4040: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4050: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4060: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4090: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
40a0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
40b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
40c0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
40d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
40e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
40f0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
4100: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4110: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4120: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4130: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4140: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  back function.. 
4150: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4160: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20  RT_Callback:.   
4170: 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72   case SRT_Sorter
4180: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
4190: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
41a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41b0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
41c0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
41d0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
41e0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
41f0: 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   v, pOrderBy);. 
4200: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4210: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4220: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
4230: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4250: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4260: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4280: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4290: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
42a0: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
42b0: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
42c0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
42d0: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
42e0: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
42f0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
4300: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
4310: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4320: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4330: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4340: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4360: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4370: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4380: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4390: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
43a0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
43b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
43c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43d0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
43e0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
43f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4400: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
4410: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4420: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
4430: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4440: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4450: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4460: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4470: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4480: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4490: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
44a0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
44b0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
44c0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
44d0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
44e0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
44f0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4500: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4510: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4520: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4530: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4540: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4550: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4570: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4580: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
45a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
45b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
45c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
45d0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
45e0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
45f0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
4600: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
4610: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
4620: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
4630: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
4640: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
4650: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
4660: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
4670: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
4680: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
4690: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
46a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
46b0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
46c0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
46d0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
46e0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
46f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4700: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
4710: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4720: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
4730: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4740: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
4750: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
4760: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
4770: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4780: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
4790: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
47a0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
47b0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
47c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
47d0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
47e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
47f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
4800: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
4810: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
4820: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
4830: 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64  end1 = sqlite3Vd
4840: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4850: 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c    int end2 = sql
4860: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4870: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
4880: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
4890: 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  fo;.  ExprList *
48a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
48b0: 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74  nCol, i;.  sqlit
48c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
48d0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44 65 73  >db;..  if( eDes
48e0: 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20  t==SRT_Sorter ) 
48f0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65 72  return;.  pOrder
4900: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
4910: 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64 65  ;.  nCol = pOrde
4920: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  rBy->nExpr;.  pI
4930: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
4940: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
4950: 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f  o) + nCol*(sizeo
4960: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
4970: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30  ;.  if( pInfo==0
4980: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
4990: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
49a0: 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e   (char*)&pInfo->
49b0: 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  aColl[nCol];.  p
49c0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
49d0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
49e0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
49f0: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74    /* If a collat
4a00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
4a10: 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69   specified expli
4a20: 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a 20 20  city, then it.  
4a30: 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69    ** is stored i
4a40: 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  n pOrderBy->a[i]
4a50: 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73  .zName. Otherwis
4a60: 65 2c 20 75 73 65 20 74 68 65 20 64 65 66 61 75  e, use the defau
4a70: 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  lt.    ** collat
4a80: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74 68 65  ion type for the
4a90: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
4aa0: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   */.    pInfo->a
4ab0: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
4ac0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4ad0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
4ae0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
4af0: 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c  if( !pInfo->aCol
4b00: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 49  l[i] ){.      pI
4b10: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
4b20: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4b30: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4b40: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
4b50: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
4b60: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
4b70: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4b80: 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c  , OP_Sort, 0, 0,
4b90: 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50   (char*)pInfo, P
4ba0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
4bb0: 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  F);.  addr = sql
4bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4bd0: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4be0: 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69   end1);.  codeLi
4bf0: 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72  miter(v, p, addr
4c00: 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77  , end2, 1);.  sw
4c10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4c20: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4c30: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4c40: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
4c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c60: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4c70: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
4c80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4ca0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4cc0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
4cd0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4cf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4d00: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
4d10: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4d30: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d50: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
4d60: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  , -1, sqlite3Vdb
4d70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
4d80: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4d90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4da0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
4db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4dc0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4dd0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
4de0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
4e10: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e  Record, 1, 0, "n
4e20: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
4e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4e50: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
4e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e70: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
4e80: 65 79 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  ey, (iParm&0x000
4e90: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4eb0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
4ec0: 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ts:.    case SRT
4ed0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
4ee0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4ef0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4f00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4f10: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4f20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4f30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4f40: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31  OP_Goto, 0, end1
4f50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4f70: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4f80: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4f90: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
4fa0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fc0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4fd0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
4fe0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
4ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5000: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
5010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5020: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
5030: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5040: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5050: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
5060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5070: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5080: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
5090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
50a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
50b0: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
50c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
50d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
50e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
50f0: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5120: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
5130: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5140: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5150: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
5160: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
5170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5180: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5190: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
51a0: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
51b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
51c0: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
51d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51e0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
51f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5200: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5210: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
5220: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5230: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5250: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5260: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
5270: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5280: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5290: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
52a0: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
52b0: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
52c0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
52d0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
52e0: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
52f0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
5300: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
5310: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
5320: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
5330: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
5340: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
5350: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5360: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
5370: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5380: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
53a0: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
53b0: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
53c0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
53d0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
53e0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
53f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5400: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
5410: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
5420: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
5430: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
5440: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
5450: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
5460: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
5470: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
5480: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
5490: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
54a0: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
54b0: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
54c0: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
54d0: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
54e0: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
54f0: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
5500: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
5510: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
5520: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
5530: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
5540: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
5550: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
5560: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
5570: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5580: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5590: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
55a0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
55b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
55c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
55d0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
55e0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
55f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5600: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
5610: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
5620: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
5630: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
5640: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
5650: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
5660: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
5670: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5680: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
5690: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
56a0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
56d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
56e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
56f0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5700: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
5710: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
5720: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
5730: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
5740: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
5750: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
5760: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
5770: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
5780: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
5790: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
57a0: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
57b0: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
57c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
57d0: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
57e0: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
57f0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
5800: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
5810: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
5820: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
5830: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
5840: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
5850: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
5860: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
5870: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
5880: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
5890: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
58a0: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
58b0: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
58c0: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
58d0: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
58e0: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
58f0: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
5900: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5910: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
5920: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
5930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5940: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
5950: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5960: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5970: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5980: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
5990: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
59a0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
59b0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
59c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
59d0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
59e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
59f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
5a00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5a10: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
5a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5a30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5a40: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5a50: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
5a60: 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e   {.      NameCon
5a70: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
5a80: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
5a90: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
5aa0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
5ab0: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
5ac0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
5ad0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
5ae0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
5af0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53  umnType(&sNC, pS
5b00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
5b10: 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72  Expr); .      br
5b20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5b30: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  f.    default:. 
5b40: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
5b50: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
5b60: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
5b70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
5b80: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
5b90: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
5ba0: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
5bb0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
5bc0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
5bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5be0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5bf0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5c00: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
5c10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5c20: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5c30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
5c40: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5c50: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5c60: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5c70: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5c80: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5c90: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5ca0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5cb0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
5cc0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
5cd0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f  = pTabList;.  fo
5ce0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5cf0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5d00: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
5d10: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5d20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5d30: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5d40: 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20  pe(&sNC, p);.   
5d50: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
5d60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
5d70: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
5d80: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
5d90: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
5da0: 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68  type, in case th
5db0: 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  e .    ** schema
5dc0: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
5dd0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
5de0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
5df0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5e00: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
5e10: 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e  me(v, i+pEList->
5e20: 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74  nExpr, zType, st
5e30: 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20  rlen(zType));.  
5e40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
5e50: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5e60: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
5e70: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
5e80: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
5e90: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
5ea0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
5eb0: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
5ec0: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
5ed0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
5ee0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
5ef0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5f00: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
5f10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5f20: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5f30: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
5f40: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
5f50: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
5f60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5f70: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
5f80: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
5f90: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5fa0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5fb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5fc0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
5fd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5fe0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
5ff0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
6000: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
6010: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6020: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
6030: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
6040: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
6050: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
6060: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
6070: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
6080: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6090: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
60a0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
60b0: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
60c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
60d0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
60e0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
60f0: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
6100: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6110: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
6120: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
6130: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
6140: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
6150: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
6160: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6170: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
6180: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
6190: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
61a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
61b0: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
61c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
61d0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
61e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
61f0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6200: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6210: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
6220: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6240: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
6250: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
6260: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
6270: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
6280: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
6290: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
62a0: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
62b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
62c0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
62d0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
62e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
62f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
6300: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
6310: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
6320: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
6330: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
6340: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
6350: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
6360: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
6370: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
6380: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
6390: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
63a0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
63b0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
63c0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
63d0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
63e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
63f0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
6400: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
6410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
6420: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
6430: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
6440: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
6450: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
6460: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
6470: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6480: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
6490: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
64a0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e  olName(v, i, p->
64b0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
64c0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
64d0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
64e0: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
64f0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
6500: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
6510: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
6520: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6530: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
6540: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6550: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
6560: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
6570: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
6580: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
6590: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
65a0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
65b0: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
65c0: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
65d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
65e0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
65f0: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
6600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6620: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6630: 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43   zCol, strlen(zC
6640: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol));.      }.  
6650: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
6660: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6670: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
6680: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6690: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
66a0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
66b0: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
66c0: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
66d0: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
66e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
66f0: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
6700: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6710: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
6720: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
6730: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
6740: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
6750: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
6760: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6770: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6780: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
6790: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
67a0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
67b0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
67c0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
67d0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
67e0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
67f0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
6800: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
6810: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
6820: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
6830: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
6840: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
6850: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
6860: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
6870: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
6880: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6890: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
68a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
68b0: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
68c0: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
68d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
68e0: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
68f0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
6900: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
6910: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
6920: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
6930: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
6940: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
6950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6960: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
6970: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
6980: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
6990: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
69a0: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
69b0: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
69c0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
69d0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
69e0: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
69f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
6a00: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
6a10: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
6a20: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
6a30: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
6a40: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
6a50: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
6a60: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
6a70: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
6a80: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
6a90: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
6aa0: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
6ab0: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
6ac0: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
6ad0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
6ae0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
6af0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6b00: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
6b10: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
6b20: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
6b30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6b40: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d    pTab = sqliteM
6b50: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
6b60: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
6b70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
6b80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
6b90: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e  b->zName = zTabN
6ba0: 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44  ame ? sqliteStrD
6bb0: 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30  up(zTabName) : 0
6bc0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
6bd0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
6be0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c  pTab->nCol = pEL
6bf0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  ist->nExpr;.  as
6c00: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
6c10: 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43  >0 );.  pTab->aC
6c20: 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69  ol = aCol = sqli
6c30: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
6c40: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
6c50: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
6c60: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
6c70: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
6c80: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
6c90: 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52      Expr *p, *pR
6ca0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
6cb0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
6cc0: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42  me;.    char *zB
6cd0: 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  asename;.    int
6ce0: 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f   cnt;.    NameCo
6cf0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a  ntext sNC;.    .
6d00: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
6d10: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
6d20: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
6d30: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
6d40: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
6d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6d60: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
6d70: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d  pRight->token.z=
6d80: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
6d90: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29  >token.z[0]!=0 )
6da0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
6db0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6dc0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
6dd0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
6de0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
6df0: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
6e00: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
6e10: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
6e20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
6e30: 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b  teStrDup(zName);
6e40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6e50: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20  ->op==TK_DOT .  
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
6e70: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
6e80: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
6e90: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
6ea0: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  ] ){.      /* Fo
6eb0: 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  r columns of the
6ec0: 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20   from A.B use B 
6ed0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
6ee0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6ef0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
6f00: 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pR->token);. 
6f10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6f20: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
6f30: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6f40: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
6f50: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
6f60: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
6f70: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
6f80: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
6f90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
6fa0: 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20  T", &p->span);. 
6fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fc0: 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66  /* If all else f
6fd0: 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20  ails, make up a 
6fe0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
6ff0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
7000: 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c  intf("column%d",
7010: 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   i+1);.    }.   
7020: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
7030: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
7040: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
7050: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
7060: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
7070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
7080: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54  eleteTable(0, pT
7090: 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ab);.      retur
70a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
70b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
70c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
70d0: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
70e0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
70f0: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
7100: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
7110: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
7120: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
7130: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42  e..    */.    zB
7140: 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  asename = zName;
7150: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
7160: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
7170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
7180: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
7190: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
71a0: 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
71b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
71c0: 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e  ("%s:%d", zBasen
71d0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
71e0: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
71f0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
7200: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
7210: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7220: 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d   zBasename!=zNam
7230: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
7240: 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29  eFree(zBasename)
7250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
7260: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
7270: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
7280: 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20   typename, type 
7290: 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f  affinity, and co
72a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
72b0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
72c0: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
72d0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
72e0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
72f0: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
7300: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
7310: 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73  c;.    zType = s
7320: 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75  qliteStrDup(colu
7330: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29 29  mnType(&sNC, p))
7340: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
7350: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
7360: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
7370: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
7380: 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c  ity(p);.    pCol
7390: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
73a0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
73b0: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
73c0: 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b   !pCol->pColl ){
73d0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  .      pCol->pCo
73e0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
73f0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
7400: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
7410: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
7420: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
7430: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
7440: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
7450: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
7460: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
7470: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
7480: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
7490: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
74a0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
74b0: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
74c0: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
74d0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
74e0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
74f0: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
7500: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
7510: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
7520: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
7530: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
7540: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
7550: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
7560: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
7570: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
7580: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
7590: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
75a0: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
75b0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
75c0: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
75d0: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
75e0: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
75f0: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
7600: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
7610: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
7620: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
7630: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
7640: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
7650: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
7660: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
7670: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
7680: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
7690: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
76a0: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
76b0: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
76c0: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
76d0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
76e0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
76f0: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
7700: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
7710: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
7720: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
7730: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
7740: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
7750: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
7760: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
7770: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7780: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
7790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
77a0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
77b0: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
77c0: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
77d0: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
77e0: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
77f0: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
7800: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
7810: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
7820: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
7830: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
7840: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
7850: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
7860: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
7870: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
7880: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
7890: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
78a0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
78b0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
78c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
78d0: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
78e0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
78f0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
7900: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
7910: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
7920: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7930: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
7940: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7950: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
7960: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
7970: 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >pSrc==0 || sqli
7980: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
7990: 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
79a0: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
79b0: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
79c0: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
79d0: 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
79e0: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
79f0: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
7a00: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
7a10: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
7a20: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
7a30: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
7a40: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
7a50: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
7a60: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b  Parse, p->pSrc);
7a70: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
7a80: 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
7a90: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7aa0: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
7ab0: 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
7ac0: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
7ad0: 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
7ae0: 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
7af0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
7b00: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
7b10: 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
7b20: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
7b30: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
7b40: 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
7b50: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
7b60: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
7b70: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
7b80: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
7b90: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
7ba0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
7bb0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
7bc0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
7bd0: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
7be0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
7bf0: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
7c00: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
7c10: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
7c20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7c30: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
7c40: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
7c50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7c60: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
7c70: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
7c80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7c90: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
7ca0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
7cb0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
7cc0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
7cd0: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
7ce0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
7cf0: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
7d00: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
7d10: 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71  ntf("sqlite_subq
7d20: 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
7d30: 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  *)pFrom->pSelect
7d40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7d50: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
7d60: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
7d70: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
7d80: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
7d90: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70  pFrom->zAlias, p
7da0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
7db0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7dc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7dd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
7df0: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
7e00: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
7e10: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
7e20: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
7e30: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
7e40: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
7e50: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
7e60: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
7e70: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
7e80: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
7e90: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
7ea0: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
7eb0: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
7ec0: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
7ed0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
7ee0: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
7ef0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23  Transient = 1;.#
7f00: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
7f10: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
7f20: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
7f30: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
7f40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
7f50: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
7f60: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
7f70: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
7f80: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72  Table(pParse,pFr
7f90: 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
7fa0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
7fb0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7fc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7fd0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   1;.      }.#ifn
7fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7ff0: 56 49 45 57 0a 20 20 20 20 20 20 69 66 28 20 70  VIEW.      if( p
8000: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
8010: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
8020: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
8030: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
8040: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
8050: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
8060: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
8070: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8080: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
8090: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
80a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
80b0: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
80c0: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
80d0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
80e0: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
80f0: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
8100: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
8110: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
8120: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
8130: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
8140: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
8150: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
8160: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
8170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
8180: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
8190: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
81a0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
81b0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
81c0: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
81d0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
81e0: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
81f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
8200: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
8210: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8220: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
8230: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
8240: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
8250: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
8260: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
8270: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
8280: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
8290: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
82a0: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
82b0: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
82c0: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
82d0: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
82e0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
82f0: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
8300: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
8310: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
8320: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
8330: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
8340: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
8350: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
8360: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
8370: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
8380: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
8390: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
83a0: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
83b0: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
83c0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
83d0: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
83e0: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
83f0: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
8400: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
8410: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
8420: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
8430: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
8440: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
8450: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
8460: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
8470: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
8480: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
8490: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
84a0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
84b0: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
84c0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
84d0: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
84e0: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
84f0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
8500: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
8510: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
8520: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
8530: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
8540: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
8550: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
8560: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
8570: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
8580: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
8590: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
85a0: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
85b0: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
85c0: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
85d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
85e0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
85f0: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
8600: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
8610: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
8620: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
8630: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
8640: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
8650: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
8660: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
8670: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
8680: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8690: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
86a0: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
86b0: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
86c0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
86d0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
86e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
86f0: 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
8700: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
8710: 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
8720: 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
8730: 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
8740: 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
8750: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
8760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
8770: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
8780: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
8790: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
87a0: 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
87b0: 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
87c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
87d0: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b  Append(pNew, a[k
87e0: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
87f0: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
8800: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
8810: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
8820: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
8830: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
8840: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
8850: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8860: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
8870: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
8880: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
8890: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
88a0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
88b0: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
88c0: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
88d0: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
88e0: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
88f0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
8900: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
8910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
8920: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
8930: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
8940: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
8950: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
8960: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
8970: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
8980: 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70  FromToken(&pE->p
8990: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
89a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
89b0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
89c0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
89d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
89e0: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
89f0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
8a00: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
8a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
8a20: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
8a30: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
8a40: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
8a50: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
8a60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
8a70: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
8a80: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
8a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
8aa0: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
8ab0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
8ad0: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
8ae0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
8af0: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8b10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
8b20: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
8b30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
8b40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b60: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
8b70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
8b80: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
8b90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
8ba0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
8bb0: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
8bd0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
8be0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
8bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8c00: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
8c10: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
8c20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
8c30: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
8c40: 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
8c50: 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e      if( (pLeft->
8c60: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
8c70: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
8ca0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
8cb0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
8cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8cd0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
8ce0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
8cf0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
8d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d10: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
8d20: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
8d30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8d40: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8d60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
8d70: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  istIndex(pLeft->
8d80: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
8d90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8da0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
8db0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
8dc0: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
8dd0: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
8de0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
8df0: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
8e00: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
8e10: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
8e20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8e30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8e40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8e50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
8e60: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
8e70: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
8e80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8e90: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
8ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8eb0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
8ec0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
8ed0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
8ee0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
8ef0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8f00: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8f10: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
8f20: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
8f30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
8f40: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
8f50: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
8f60: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
8f70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8f80: 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
8f90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
8fa0: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
8fb0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
8fc0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
8fd0: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
8fe0: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73  (&pExpr->span, s
8ff0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
9000: 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
9010: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
9020: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
9030: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
9040: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9050: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9070: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
9080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9090: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
90a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
90b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
90c0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
90d0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
90e0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
90f0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
9100: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9110: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
9120: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9130: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
9140: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
9150: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  en);.          }
9160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9170: 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
9180: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
9190: 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
91a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
91b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
91c0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
91d0: 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
91e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9200: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9210: 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
9220: 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
9230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9240: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
9250: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
9260: 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  teFree(zTName);.
9270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9280: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9290: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
92a0: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
92b0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74   pNew;.  }.  ret
92c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
92d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
92e0: 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b  cursively unlink
92f0: 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  s the Select.pSr
9300: 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74  c.a[].pTab point
9310: 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65  ers.** in a sele
9320: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ct structure.  I
9330: 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  t just sets the 
9340: 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c  pointers to NULL
9350: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
9360: 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ne is recursive 
9370: 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
9380: 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e  t if the Select.
9390: 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74  pSrc.a[].pSelect
93a0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  .** pointer is n
93b0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f  ot NULL, this ro
93c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
93d0: 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
93e0: 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  hat pointer..**.
93f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9400: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
9410: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
9420: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
9430: 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65  .** VIEW in orde
9440: 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69  r to undo any bi
9450: 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73  ndings to tables
9460: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
9470: 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  sary.** because 
9480: 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67  those tables mig
9490: 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20  ht be DROPed by 
94a0: 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c  a subsequent SQL
94b0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20   command..** If 
94c0: 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65  the bindings are
94d0: 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68   not removed, th
94e0: 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  en the Select.pS
94f0: 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  rc->a[].pTab fie
9500: 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65  ld.** will be le
9510: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ft pointing to a
9520: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62   deallocated Tab
9530: 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74  le structure aft
9540: 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61  er the.** DROP a
9550: 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69  nd a coredump wi
9560: 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78  ll occur the nex
9570: 74 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20  t time the VIEW 
9580: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 20  is used..*/.#if 
9590: 30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  0.void sqlite3Se
95a0: 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63  lectUnbind(Selec
95b0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
95c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
95d0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 74 72  = p->pSrc;.  str
95e0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
95f0: 20 2a 70 49 74 65 6d 3b 0a 20 20 54 61 62 6c 65   *pItem;.  Table
9600: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
9610: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
9620: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
9630: 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63 2d 3e 6e  rc->a; i<pSrc->n
9640: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
9650: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
9660: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  b = pItem->pTab)
9670: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
9680: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
9690: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
96a0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
96b0: 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  (0, pTab);.     
96c0: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e   }.      pItem->
96d0: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
96e0: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
96f0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
9700: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
9710: 64 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  d(pItem->pSelect
9720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9730: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
9740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9750: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9760: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
9770: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
9780: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
9790: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
97a0: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
97b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
97c0: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
97d0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
97e0: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
97f0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
9800: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
9810: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
9820: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
9830: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
9840: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
9850: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
9860: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
9870: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
9880: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
9890: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
98a0: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
98b0: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
98c0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
98d0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
98e0: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
98f0: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
9900: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
9910: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
9920: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
9930: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
9940: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
9950: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
9960: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
9970: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
9980: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
9990: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
99a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
99b0: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
99c0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
99d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
99e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
99f0: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
9a00: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
9a10: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
9a30: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
9a40: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
9a50: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
9a60: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
9a70: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
9a80: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
9a90: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
9aa0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9ac0: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
9ad0: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
9ae0: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
9af0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
9b00: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
9b10: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
9b20: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
9b30: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
9b40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9b50: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
9b60: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
9b70: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9b80: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
9b90: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
9ba0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
9bb0: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
9bc0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
9bd0: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
9be0: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
9bf0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
9c00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
9c10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
9c20: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
9c30: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
9c40: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
9c50: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
9c60: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
9c70: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
9c80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
9c90: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
9ca0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
9cb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9cc0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
9cd0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
9ce0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
9cf0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
9d00: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
9d10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
9d20: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
9d30: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
9d40: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9d50: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
9d60: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9d70: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
9d80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
9d90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9da0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
9db0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9dc0: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
9dd0: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
9de0: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
9df0: 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d     iCol, pEList-
9e00: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
9e10: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
9e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9e30: 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43        if( !mustC
9e40: 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e  omplete ) contin
9e50: 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d  ue;.      iCol--
9e60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9e70: 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a  j=0; iCol<0 && j
9e80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
9e90: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
9ea0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
9eb0: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
9ec0: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
9ed0: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
9ee0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
9ef0: 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  e, *zLabel;.    
9f00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
9f10: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
9f20: 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d          zLabel =
9f30: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9f40: 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e  Token(&pE->token
9f50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9f60: 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a  t( zLabel!=0 );.
9f70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9f80: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
9f90: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
9fa0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
9fb0: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
9fc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
9fd0: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
9fe0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
9ff0: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  l<0 && sqlite3Ex
a000: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
a010: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
a020: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
a030: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
a040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
a050: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
a060: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
a070: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
a080: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
a090: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
a0a0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d  Table;.      pE-
a0b0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
a0c0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
a0d0: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
a0e0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
a0f0: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
a100: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a120: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
a130: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
a140: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
a150: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
a160: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
a170: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
a180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a190: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
a1a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
a1b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a1c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
a1d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   */../*.** Get a
a1e0: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
a1f0: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
a200: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
a210: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
a220: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
a230: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
a240: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
a250: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
a260: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
a270: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
a280: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
a290: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a2a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
a2b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
a2c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
a2d0: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
a2e0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
a2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
a300: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
a310: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
a320: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
a330: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
a340: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
a350: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
a360: 70 72 65 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d  pressions.  nLim
a370: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68  it and nOffset h
a380: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
a390: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
a3a0: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
a3b0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
a3c0: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
a3d0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
a3e0: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
a3f0: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
a400: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
a410: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
a420: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
a430: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
a440: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
a450: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
a460: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
a470: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
a480: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
a490: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
a4a0: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
a4b0: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
a4c0: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
a4d0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
a4e0: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
a4f0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20 69   the values if i
a500: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a510: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
a520: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
a530: 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69  s defined by nLi
a540: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e  mit and nOffset.
a550: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
a560: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
a570: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
a580: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
a590: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
a5a0: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
a5b0: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
a5c0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
a5d0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
a5e0: 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30  nly if nLimit>=0
a5f0: 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f   or nOffset>0 do
a600: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
a610: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
a620: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
a630: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
a640: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
a650: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
a660: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
a670: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
a680: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
a690: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
a6a0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
a6b0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
a6c0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
a6d0: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
a6e0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a6f0: 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  *p){.  /* .  ** 
a700: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
a710: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
a720: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
a730: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
a740: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
a750: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
a760: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
a770: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
a780: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
a790: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
a7a0: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
a7b0: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
a7c0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
a7d0: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
a7e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a7f0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
a800: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a810: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a820: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a830: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a840: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
a850: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a860: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a870: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
a880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61  AddOp(v, OP_Nega
a8a0: 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tive, 0, 0);.   
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
a8d0: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
a8e0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
a8f0: 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  "# LIMIT counter
a900: 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  "));.    p->iLim
a910: 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20  it = iMem;.  }. 
a920: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
a930: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  ){.    int iMem 
a940: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
a950: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
a960: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a970: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a980: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
a990: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a9a0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
a9b0: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
a9c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a9d0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
a9e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a9f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aa00: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
aa10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
aa20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
aa30: 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
aa40: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
aa50: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
aa60: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d  unter"));.    p-
aa70: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >iOffset = iMem;
aa80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
aa90: 6e 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74  nerate VDBE inst
aaa0: 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69  ructions that wi
aab0: 6c 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69  ll open a transi
aac0: 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
aad0: 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  * will be used f
aae0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74  or an index or t
aaf0: 6f 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65  o store keyed re
ab00: 73 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70  sults for a comp
ab10: 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20  ound.** select. 
ab20: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ab30: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
ab40: 74 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65  t table that nee
ab50: 64 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ds a.** KeyInfo 
ab60: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
ab70: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
ab80: 73 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  s in the KeyInfo
ab90: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
aba0: 2a 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20  * by the result 
abb0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
abc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  T statement in t
abd0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
abe0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  nt..**.** Specif
abf0: 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75  ically, this rou
ac00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
ac10: 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20  o open an index 
ac20: 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53  table for.** DIS
ac30: 54 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e  TINCT, UNION, IN
ac40: 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45  TERSECT and EXCE
ac50: 50 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  PT select statem
ac60: 65 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a  ents (but not .*
ac70: 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a  * UNION ALL)..**
ac80: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77  .** Make the new
ac90: 20 74 61 62 6c 65 20 61 20 4b 65 79 41 73 44 61   table a KeyAsDa
aca0: 74 61 20 74 61 62 6c 65 20 69 66 20 6b 65 79 41  ta table if keyA
acb0: 73 44 61 74 61 20 69 73 20 74 72 75 65 2e 0a 2a  sData is true..*
acc0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
acd0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 61  eturned is the a
ace0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
acf0: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
ad00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
ad10: 20 69 6e 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64   int openTempInd
ad20: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
ad30: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
ad40: 20 69 54 61 62 2c 20 69 6e 74 20 6b 65 79 41 73   iTab, int keyAs
ad50: 44 61 74 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  Data){.  KeyInfo
ad60: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
ad70: 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c  t nColumn;.  sql
ad80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ad90: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
ada0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
adb0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
adc0: 20 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 70 72   addr;..  if( pr
add0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
ade0: 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
adf0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
ae00: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69  Column = p->pELi
ae10: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65  st->nExpr;.  pKe
ae20: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
ae30: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b  lloc( sizeof(*pK
ae40: 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a  eyInfo)+nColumn*
ae50: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
ae60: 20 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   );.  if( pKeyIn
ae70: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fo==0 ) return 0
ae80: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  ;.  pKeyInfo->en
ae90: 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 70  c = db->enc;.  p
aea0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
aeb0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72  = nColumn;.  for
aec0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
aed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49   i++){.    pKeyI
aee0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
aef0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
af00: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
af10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
af20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
af30: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
af40: 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  {.      pKeyInfo
af50: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d  ->aColl[i] = db-
af60: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
af70: 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 73  }.  }.  addr = s
af80: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
af90: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54   OP_OpenTemp, iT
afa0: 61 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 28 63  ab, 0, .      (c
afb0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
afc0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
afd0: 46 29 3b 0a 20 20 69 66 28 20 6b 65 79 41 73 44  F);.  if( keyAsD
afe0: 61 74 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ata ){.    sqlit
aff0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b000: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 69 54 61  P_KeyAsData, iTa
b010: 62 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  b, 1);.  }.  ret
b020: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
b030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b040: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b050: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 61  ./*.** Add the a
b060: 64 64 72 65 73 73 20 22 61 64 64 72 22 20 74 6f  ddress "addr" to
b070: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
b080: 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 20  OpenTemp opcode 
b090: 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74 68 61  addresses.** tha
b0a0: 74 20 61 72 65 20 62 65 69 6e 67 20 61 63 63 75  t are being accu
b0b0: 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e 70 70  mulated in p->pp
b0c0: 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f 0a 73 74 61  OpenTemp..*/.sta
b0d0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
b0e0: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
b0f0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61  Select *p, int a
b100: 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a  ddr){.  IdList *
b110: 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70 4f 70  pList = *p->ppOp
b120: 65 6e 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33  enTemp = sqlite3
b130: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 2a 70 2d  IdListAppend(*p-
b140: 3e 70 70 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b  >ppOpenTemp, 0);
b150: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
b160: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b170: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
b180: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
b190: 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61  ->nId-1].idx = a
b1a0: 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ddr;.  return SQ
b1b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
b1c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b1d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b1e0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b1f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b200: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
b210: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
b220: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
b230: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
b240: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
b250: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
b260: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
b270: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
b280: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
b290: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
b2a0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
b2b0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
b2c0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
b2d0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
b2e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
b2f0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
b300: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
b310: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
b320: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
b330: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
b340: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
b350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
b360: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
b370: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
b380: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b390: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
b3a0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
b3b0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b3c0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
b3d0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
b3e0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
b3f0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
b400: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
b410: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
b420: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
b430: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
b440: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b450: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
b460: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
b470: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
b480: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b490: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b4a0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
b4b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
b4c0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
b4d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b4e0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
b4f0: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
b500: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
b510: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
b520: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
b530: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
b540: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
b550: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
b560: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
b570: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
b580: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
b590: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
b5a0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
b5b0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
b5c0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
b5d0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b5e0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b5f0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b600: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b610: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b620: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b630: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b640: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
b650: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
b660: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
b670: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
b680: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
b690: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
b6a0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
b6b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b6c0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b6d0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
b6e0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b6f0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
b700: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
b710: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
b720: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
b730: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
b740: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b750: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
b760: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
b770: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b7a0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
b7b0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
b7c0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
b7d0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
b7e0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
b7f0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
b800: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
b810: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
b820: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
b830: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
b840: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
b850: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
b860: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
b870: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
b880: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
b890: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
b8a0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
b8b0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
b8c0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
b8d0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
b8e0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
b8f0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
b900: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b910: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b920: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
b930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b940: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b950: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b960: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b970: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b980: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b990: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b9a0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
b9b0: 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20          /* \___ 
b9c0: 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73   Store query res
b9d0: 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65  ults as specifie
b9e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  d */.  int iParm
b9f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ba00: 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74  /     by these t
ba10: 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  wo parameters.  
ba20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72         */.  char
ba30: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
ba40: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
ba50: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
ba60: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
ba70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
ba80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
ba90: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
baa0: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
bab0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
bac0: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
bad0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
bae0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
baf0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
bb00: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
bb10: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
bb20: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
bb30: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e  .  IdList *pOpen
bb40: 54 65 6d 70 20 3d 20 30 3b 2f 2a 20 4f 50 5f 4f  Temp = 0;/* OP_O
bb50: 70 65 6e 54 65 6d 70 20 6f 70 63 6f 64 65 73 20  penTemp opcodes 
bb60: 74 68 61 74 20 6e 65 65 64 20 61 20 4b 65 79 49  that need a KeyI
bb70: 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 41 64  nfo */.  int aAd
bb80: 64 72 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 2f  dr[5];         /
bb90: 2a 20 41 64 64 72 65 73 73 65 73 20 6f 66 20 53  * Addresses of S
bba0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 70 65  etNumColumns ope
bbb0: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
bbc0: 6e 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20  nAddr = 0;      
bbd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73 65 64    /* Number used
bbe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bc00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bc10: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
bc20: 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  et */..  /* Make
bc30: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
bc40: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
bc50: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
bc60: 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
bc70: 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
bc80: 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
bc90: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
bca0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
bcb0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
bcc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
bcd0: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
bce0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
bcf0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bd00: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bd10: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
bd20: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
bd30: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
bd40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bd50: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
bd60: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
bd70: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bd80: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bd90: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bda0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bdb0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bdc0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bdd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
bde0: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
bdf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
be00: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
be10: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
be20: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
be30: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
be40: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
be50: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
be60: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
be70: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
be80: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
be90: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
bea0: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
beb0: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
bec0: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
bed0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
bee0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
bef0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
bf00: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
bf10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
bf20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 20    }..  /* If *p 
bf30: 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
bf40: 74 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 73 74  t-most select st
bf50: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 69 6e  atement, then in
bf60: 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 70 2d  itialize.  ** p-
bf70: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 74 6f 20 70  >ppOpenTemp to p
bf80: 6f 69 6e 74 20 74 6f 20 70 4f 70 65 6e 54 65 6d  oint to pOpenTem
bf90: 70 2e 20 20 49 66 20 2a 70 20 69 73 20 6e 6f 74  p.  If *p is not
bfa0: 20 74 68 65 20 72 69 67 68 74 20 6d 6f 73 74 0a   the right most.
bfb0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
bfc0: 68 65 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d  hen p->ppOpenTem
bfd0: 70 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  p will have alre
bfe0: 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ady been initial
bff0: 69 7a 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 70  ized.  ** by a p
c000: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
c010: 73 20 73 61 6d 65 20 70 72 6f 63 65 64 75 72 65  s same procedure
c020: 2e 20 20 50 61 73 73 20 61 6c 6f 6e 67 20 74 68  .  Pass along th
c030: 65 20 70 4f 70 65 6e 54 65 6d 70 0a 20 20 2a 2a  e pOpenTemp.  **
c040: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 50 72 69   pointer to pPri
c050: 6f 72 2c 20 74 68 65 20 6e 65 78 74 20 73 74 61  or, the next sta
c060: 74 65 6d 65 6e 74 20 74 6f 20 6f 75 72 20 6c 65  tement to our le
c070: 66 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ft..  */.  if( p
c080: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3d 3d 30 20  ->ppOpenTemp==0 
c090: 29 7b 0a 20 20 20 20 70 2d 3e 70 70 4f 70 65 6e  ){.    p->ppOpen
c0a0: 54 65 6d 70 20 3d 20 26 70 4f 70 65 6e 54 65 6d  Temp = &pOpenTem
c0b0: 70 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 2d  p;.  }.  pPrior-
c0c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d  >ppOpenTemp = p-
c0d0: 3e 70 70 4f 70 65 6e 54 65 6d 70 3b 0a 0a 20 20  >ppOpenTemp;..  
c0e0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
c0f0: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
c100: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
c110: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
c120: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
c130: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73  pTable ){.    as
c140: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c160: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
c170: 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
c180: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
c190: 41 64 64 72 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Addr==0 );.    a
c1a0: 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20  Addr[nAddr++] = 
c1b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c1c0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
c1d0: 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 30 29 3b  umns, iParm, 0);
c1e0: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
c1f0: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
c200: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c210: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
c220: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
c230: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
c240: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c250: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c260: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
c270: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ->pOrderBy==0 ){
c280: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c290: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
c2b0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
c2c0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
c2d0: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
c2e0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
c2f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c300: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c310: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
c320: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c330: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
c340: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c350: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c360: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c370: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
c380: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c390: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
c3a0: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
c3b0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c3c0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c3d0: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  et;.        p->p
c3e0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
c3f0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c400: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
c410: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c420: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
c430: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c440: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
c450: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
c470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
c480: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c490: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
c4a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
c4c0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
c4d0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
c4e0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
c4f0: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
c500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c510: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
c520: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
c530: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
c540: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c550: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
c560: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
c570: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
c580: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
c590: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c5a0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
c5b0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
c5c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
c5d0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
c5e0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c5f0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
c600: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
c610: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
c620: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
c630: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
c640: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
c650: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
c660: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
c670: 72 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy;     /* The 
c680: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c690: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45  for the right SE
c6a0: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e  LECT */.      in
c6b0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70  t addr;..      p
c6c0: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
c6d0: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
c6e0: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
c6f0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
c700: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70  =priorOp && p->p
c710: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70  OrderBy==0 && !p
c720: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
c730: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c740: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
c750: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
c760: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
c770: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
c780: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
c790: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
c7a0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
c7b0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
c7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c7d0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
c7e0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
c7f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c800: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
c810: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
c820: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
c830: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c840: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
c850: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c860: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
c870: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
c880: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
c890: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
c8a0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
c8b0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
c8c0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c8d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c8e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c8f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c900: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c920: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
c930: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
c940: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  f( p->op!=TK_ALL
c950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
c960: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
c970: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
c980: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
c990: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c9b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c9c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  t_end;.         
c9d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
c9e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c9f0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
ca00: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
ca10: 20 20 20 20 20 7d 0a 09 61 73 73 65 72 74 28 20       }..assert( 
ca20: 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64  nAddr<sizeof(aAd
ca30: 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72  dr)/sizeof(aAddr
ca40: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  [0]) );.        
ca50: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
ca60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca70: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
ca80: 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c  lumns, unionTab,
ca90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
caa0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
cab0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cac0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
cad0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
cae0: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
caf0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
cb00: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
cb10: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20  rBy );.      rc 
cb20: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
cb30: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
cb40: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
cb50: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
cb60: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
cb70: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
cb80: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cb90: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cba0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
cbb0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
cbc0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
cbd0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
cbe0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
cbf0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
cc00: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
cc10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
cc20: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
cc30: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
cc40: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
cc50: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
cc60: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
cc70: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
cc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cc90: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
cca0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
ccb0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
ccc0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
ccd0: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
cce0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
ccf0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
cd00: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
cd10: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
cd20: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
cd30: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
cd40: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
cd50: 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f  rse, p, op, unio
cd60: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
cd70: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
cd80: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
cd90: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
cda0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
cdb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
cdc0: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
cdd0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
cde0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
cdf0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
ce00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
ce10: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
ce20: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
ce30: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  -1;.      if( rc
ce40: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ce50: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ce60: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
ce70: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
ce80: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
ce90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
cea0: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
ceb0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
cec0: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
ced0: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
cee0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
cef0: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
cf00: 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61  || unionTab!=iPa
cf10: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
cf20: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
cf30: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
cf40: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
cf50: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
cf60: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
cf70: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
cf80: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
cf90: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
cfa0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
cfb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cfc0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
cfd0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
cfe0: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
cff0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d000: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d020: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
d030: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
d040: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  ak);.        com
d050: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
d060: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
d070: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d080: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d090: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d0a0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d0b0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d0c0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
d0d0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
d0e0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
d110: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
d120: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
d150: 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  k, 0);.        i
d160: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d170: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
d180: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d190: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
d1b0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d1c0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
d1d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d1e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d1f0: 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
d200: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d220: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
d230: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d250: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
d260: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
d270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d280: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d290: 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20  INTERSECT: {.   
d2a0: 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
d2b0: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
d2c0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
d2d0: 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  rt;.      Expr *
d2e0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
d2f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
d300: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
d310: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
d320: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
d330: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
d340: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
d350: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d360: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
d370: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
d380: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
d390: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
d3a0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
d3b0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
d3c0: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
d3d0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d3e0: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
d3f0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d400: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
d410: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
d420: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
d430: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
d440: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
d450: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
d460: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d470: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d480: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d4a0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
d4b0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b1, 0);.      rc
d4c0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
d4d0: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
d4e0: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
d4f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d500: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d510: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d540: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
d550: 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  ab1, 1);.      a
d560: 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a  ssert( nAddr<siz
d570: 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f  eof(aAddr)/sizeo
d580: 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20  f(aAddr[0]) );. 
d590: 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72       aAddr[nAddr
d5a0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d5b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
d5c0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 31  NumColumns, tab1
d5d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d5e0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d5f0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d600: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
d610: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
d620: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d630: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
d640: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d650: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d660: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
d670: 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c  , tab1, 0, 0, 0,
d680: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
d690: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d6a0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d6b0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d6c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d6d0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
d6e0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d6f0: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
d700: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
d710: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d720: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
d730: 70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  p, tab2, 0);.   
d740: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
d750: 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28  ectOpenTempAddr(
d760: 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  p, addr);.      
d770: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d780: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
d790: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d7a0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
d7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7c0: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
d7d0: 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20  ta, tab2, 1);.  
d7e0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 64 64      assert( nAdd
d7f0: 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f  r<sizeof(aAddr)/
d800: 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29  sizeof(aAddr[0])
d810: 20 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b   );.      aAddr[
d820: 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74  nAddr++] = sqlit
d830: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d840: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
d850: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d860: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d870: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d880: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d890: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d8a0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d8b0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d8c0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d8d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8e0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d8f0: 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  , p, SRT_Union, 
d900: 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab2, 0, 0, 0, a
d910: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
d920: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
d930: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d940: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
d950: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
d960: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
d970: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d980: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
d990: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d9a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d9b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
d9c0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
d9d0: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
d9e0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
d9f0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
da00: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
da10: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
da20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
da30: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
da40: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
da50: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
da60: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
da70: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
da80: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
da90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
daa0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
dab0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
dac0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
dad0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
dae0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
daf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
db00: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
db10: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
db20: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
db30: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
db40: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
db50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db60: 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c  p(v, OP_FullKey,
db70: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
db80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db90: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
dba0: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
dbb0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
dbc0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
dbd0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
dbe0: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
dbf0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
dc20: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
dc30: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
dc60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
dc70: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
dc80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
dc90: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
dca0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
dcb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
dcc0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
dcd0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
dce0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dcf0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
dd00: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
dd10: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
dd20: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
dd30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dd40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
dd50: 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
dd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
dd80: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
dd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dda0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
ddb0: 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
ddc0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
ddd0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
dde0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
ddf0: 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
de00: 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
de10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
de20: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
de30: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
de40: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
de50: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
de60: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
de70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
de80: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
de90: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
dea0: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
deb0: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
dec0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
ded0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
dee0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
def0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
df00: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
df10: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
df20: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nd;.  }..  /* Se
df30: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
df40: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f  columns in tempo
df50: 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f  rary tables.  */
df60: 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  .  nCol = p->pEL
df70: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68  ist->nExpr;.  wh
df80: 69 6c 65 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a  ile( nAddr>0 ){.
df90: 20 20 20 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20      nAddr--;.   
dfa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
dfb0: 67 65 50 32 28 76 2c 20 61 41 64 64 72 5b 6e 41  geP2(v, aAddr[nA
dfc0: 64 64 72 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ddr], nCol);.  }
dfd0: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
dfe0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dff0: 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
e000: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
e010: 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
e020: 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
e030: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
e040: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
e050: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
e060: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
e070: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
e080: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
e090: 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
e0a0: 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
e0b0: 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
e0c0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
e0d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
e0e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
e0f0: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
e100: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
e110: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e120: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
e130: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
e140: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
e150: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
e160: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
e170: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
e180: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
e190: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
e1a0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
e1b0: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
e1c0: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
e1d0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
e1e0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
e1f0: 7c 7c 20 28 70 4f 70 65 6e 54 65 6d 70 20 26 26  || (pOpenTemp &&
e200: 20 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e   pOpenTemp->nId>
e210: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e240: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
e250: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e270: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
e280: 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
e290: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
e2a0: 73 65 72 74 28 20 70 2d 3e 70 70 4f 70 65 6e 54  sert( p->ppOpenT
e2b0: 65 6d 70 20 3d 3d 20 26 70 4f 70 65 6e 54 65 6d  emp == &pOpenTem
e2c0: 70 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  p );.    pKeyInf
e2d0: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
e2e0: 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66  (sizeof(*pKeyInf
e2f0: 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  o)+nCol*sizeof(C
e300: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 69  ollSeq*));.    i
e310: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
e320: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e330: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e340: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e350: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
e360: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
e370: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
e380: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
e390: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a  nField = nCol;..
e3a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e3b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
e3c0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
e3d0: 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
e3e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e3f0: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
e400: 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ( !pKeyInfo->aCo
e410: 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
e420: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
e430: 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  [i] = pParse->db
e440: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
e450: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e460: 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65  for(i=0; pOpenTe
e470: 6d 70 20 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d  mp && i<pOpenTem
e480: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
e490: 20 20 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d      int p3type =
e4a0: 20 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46   (i==0?P3_KEYINF
e4b0: 4f 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59  O_HANDOFF:P3_KEY
e4c0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74  INFO);.      int
e4d0: 20 61 64 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d   addr = pOpenTem
e4e0: 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20  p->a[i].idx;.   
e4f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e500: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
e510: 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
e520: 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 20 20 7d  , p3type);.    }
e530: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  ..    if( p->pOr
e540: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
e550: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e560: 74 65 6d 20 2a 70 4f 72 64 65 72 42 79 54 65 72  tem *pOrderByTer
e570: 6d 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  m = p->pOrderBy-
e580: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
e590: 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  0; i<p->pOrderBy
e5a0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f  ->nExpr; i++, pO
e5b0: 72 64 65 72 42 79 54 65 72 6d 2b 2b 29 7b 0a 20  rderByTerm++){. 
e5c0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
e5d0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 54 65 72  pr = pOrderByTer
e5e0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e5f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e600: 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 7a 4e  pOrderByTerm->zN
e610: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
e620: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
e630: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
e640: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
e650: 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61   );.        /* a
e660: 73 73 65 72 74 28 20 21 70 45 78 70 72 2d 3e 70  ssert( !pExpr->p
e670: 43 6f 6c 6c 20 29 3b 20 2a 2f 0a 20 20 20 20 20  Coll ); */.     
e680: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
e690: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
e6a0: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
e6b0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
e6c0: 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  arse, zName, -1)
e6d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e6e0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
e6f0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e  ->pColl = pKeyIn
e700: 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78 70 72 2d  fo->aColl[pExpr-
e710: 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
e720: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e730: 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
e740: 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
e750: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
e760: 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
e770: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e780: 28 20 21 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a  ( !pOpenTemp ){.
e790: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61        /* This ha
e7a0: 70 70 65 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20  ppens for UNION 
e7b0: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
e7c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
e7d0: 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  Free(pKeyInfo);.
e7e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69      }.  }..multi
e7f0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69  _select_end:.  i
e800: 66 28 20 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a  f( pOpenTemp ){.
e810: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
e820: 74 44 65 6c 65 74 65 28 70 4f 70 65 6e 54 65 6d  tDelete(pOpenTem
e830: 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 70 4f  p);.  }.  p->ppO
e840: 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72  penTemp = 0;.  r
e850: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e860: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e870: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e880: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
e890: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
e8a0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
e8b0: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
e8c0: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
e8d0: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
e8e0: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
e8f0: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
e900: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
e910: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
e920: 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
e930: 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
e940: 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
e950: 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
e960: 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
e970: 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
e980: 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
e990: 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
e9a0: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
e9b0: 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
e9c0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
e9d0: 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
e9e0: 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
e9f0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
ea00: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
ea10: 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
ea20: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
ea30: 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
ea40: 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
ea50: 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
ea60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
ea70: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
ea80: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
ea90: 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
eaa0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
eab0: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
eac0: 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
ead0: 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
eae0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
eaf0: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
eb00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
eb10: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
eb20: 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73  ist*,int,ExprLis
eb30: 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  t*);  /* Forward
eb40: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
eb50: 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
eb60: 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20  (Select *, int, 
eb70: 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a  ExprList *);  /*
eb80: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
eb90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
eba0: 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78  stExpr(Expr *pEx
ebb0: 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  pr, int iTable, 
ebc0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ebd0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
ebe0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ebf0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ec00: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
ec10: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
ec20: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
ec30: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
ec40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
ec50: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
ec60: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
ec70: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
ec80: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
ec90: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
eca0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
ecb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ecc0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
ecd0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
ece0: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
ecf0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
ed00: 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
ed10: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
ed20: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
ed30: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
ed40: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
ed50: 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
ed60: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ed70: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
ed80: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
ed90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
eda0: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
edb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
edc0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
edd0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
ede0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
edf0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
ee00: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
ee10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
ee20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
ee30: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
ee40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
ee50: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
ee60: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
ee70: 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
ee80: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
ee90: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
eea0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
eeb0: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
eec0: 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
eed0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
eee0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
eef0: 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
ef00: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
ef10: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
ef20: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
ef30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c       pExpr->pSel
ef40: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
ef50: 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70 53 65  ectDup(pNew->pSe
ef60: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
ef70: 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
ef80: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
ef90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
efa0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
efb0: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
efc0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
efd0: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
efe0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
eff0: 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
f000: 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ct(pExpr->pSelec
f010: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
f020: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
f030: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
f040: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
f050: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
f060: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
f070: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
f080: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
f090: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
f0a0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
f0b0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
f0c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
f0d0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
f0e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
f0f0: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
f100: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
f110: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
f120: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
f130: 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  tSelect(Select *
f140: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  p, int iTable, E
f150: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
f160: 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  {.  if( !p ) ret
f170: 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
f180: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
f190: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
f1a0: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
f1b0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54  (p->pGroupBy, iT
f1c0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
f1d0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f1e0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
f1f0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
f200: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
f210: 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ing, iTable, pEL
f220: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
f230: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  r(p->pWhere, iTa
f240: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ble, pEList);.}.
f250: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
f260: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
f270: 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  IEW) */..#ifndef
f280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f290: 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  W./*.** This rou
f2a0: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
f2b0: 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
f2c0: 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
f2d0: 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
f2e0: 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
f2f0: 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
f300: 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
f310: 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
f320: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
f330: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
f340: 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
f350: 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
f360: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
f370: 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
f380: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
f390: 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
f3a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
f3b0: 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
f3c0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
f3d0: 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
f3e0: 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
f3f0: 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
f400: 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
f410: 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
f420: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
f430: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
f440: 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
f450: 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
f460: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
f470: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
f480: 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
f490: 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
f4a0: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
f4b0: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
f4c0: 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
f4d0: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
f4e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f4f0: 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
f500: 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
f510: 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
f520: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f530: 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
f540: 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
f550: 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
f560: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
f570: 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
f580: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
f590: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
f5a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
f5b0: 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
f5c0: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
f5d0: 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
f5e0: 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
f5f0: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
f600: 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
f610: 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
f620: 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
f630: 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
f640: 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
f650: 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
f660: 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
f670: 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
f680: 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
f690: 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
f6a0: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
f6b0: 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
f6c0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
f6d0: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
f6e0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
f6f0: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
f700: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
f710: 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
f720: 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
f730: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
f740: 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
f750: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f760: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
f770: 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
f780: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
f790: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
f7a0: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
f7b0: 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20   join, or.**    
f7c0: 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79      the subquery
f7d0: 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61   is not itself a
f7e0: 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20   join.  (Ticket 
f7f0: 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  #306).**.**   (4
f800: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f810: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
f820: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f830: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
f840: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
f850: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f860: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
f870: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f880: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
f890: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
f8a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
f8b0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f8c0: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
f8d0: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
f8e0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
f8f0: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
f900: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
f910: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
f920: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
f930: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
f940: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f950: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
f960: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f970: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
f980: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
f990: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
f9a0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
f9b0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
f9c0: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
f9d0: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
f9e0: 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
f9f0: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
fa00: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
fa10: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
fa20: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
fa30: 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
fa40: 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
fa50: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
fa60: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
fa70: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
fa80: 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
fa90: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
faa0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
fab0: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
fac0: 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f  term of a LEFT O
fad0: 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65  UTER JOIN or the
fae0: 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
faf0: 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
fb00: 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64   clause.  (added
fb10: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29   by ticket #350)
fb20: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
fb30: 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
fb40: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
fb50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
fb60: 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
fb70: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
fb80: 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
fb90: 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
fba0: 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
fbb0: 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
fbc0: 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
fbd0: 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
fbe0: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
fbf0: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
fc00: 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
fc10: 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
fc20: 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
fc30: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
fc40: 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
fc50: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
fc60: 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
fc70: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
fc80: 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
fc90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fca0: 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
fcb0: 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
fcc0: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
fcd0: 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
fce0: 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
fcf0: 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
fd00: 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
fd10: 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
fd20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
fd30: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
fd40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
fd50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
fd60: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
fd70: 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
fd80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
fd90: 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
fda0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
fdb0: 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
fdc0: 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
fdd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
fde0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
fdf0: 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
fe00: 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
fe10: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
fe20: 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
fe30: 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
fe40: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
fe50: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
fe60: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
fe70: 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
fe80: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
fe90: 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
fea0: 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
feb0: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
fec0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
fed0: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
fee0: 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
fef0: 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
ff00: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
ff10: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
ff20: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ff30: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
ff40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ff50: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
ff60: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
ff70: 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
ff80: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
ff90: 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
ffa0: 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
ffb0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
ffc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ffd0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
ffe0: 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10000 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10010 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
10020 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
10030 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
10040 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  ubquery */..  /*
10050 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10060 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
10070 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
10080 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
10090 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
100a0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
100b0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
100c0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
100d0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
100e0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
100f0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
10100 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62  a[iFrom];.  pSub
10110 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
10120 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
10130 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
10140 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
10150 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
10160 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   0;.  if( subque
10170 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
10180 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
10190 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20   0;.  pSubSrc = 
101a0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
101b0 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
101c0 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 70 4c  .  if( (pSub->pL
101d0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
101e0 74 29 20 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66  t) || pSub->pOff
101f0 73 65 74 20 7c 7c 20 0a 20 20 20 20 20 20 28 70  set || .      (p
10200 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69  Sub->pLimit && i
10210 73 41 67 67 29 20 29 20 72 65 74 75 72 6e 20 30  sAgg) ) return 0
10220 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
10230 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
10240 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d  n 0;.  if( pSub-
10250 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 28  >isDistinct && (
10260 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
10270 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
10280 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
10290 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
102a0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
102b0 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
102c0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
102d0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
102e0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  y ) return 0;.. 
102f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
10300 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
10310 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
10320 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
10330 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
10340 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
10350 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
10360 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
10370 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
10380 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
10390 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
103a0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
103b0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
103c0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
103d0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
103e0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
103f0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
10400 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
10410 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
10420 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
10430 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
10440 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
10450 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
10460 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
10470 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e  nSrc>1 && iFrom>
10480 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
10490 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
104a0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
104b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
104c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
104d0 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
104e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
104f0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
10500 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
10510 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
10520 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
10530 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
10540 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
10550 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
10560 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
10570 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
10580 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
10590 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
105a0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
105b0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
105c0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
105d0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
105e0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
105f0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
10600 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
10610 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
10620 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
10630 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
10640 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
10650 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
10660 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
10670 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
10680 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
10690 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
106a0 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
106b0 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  ( iFrom>0 && (pS
106c0 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
106d0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
106e0 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26  ER)!=0 .      &&
106f0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30   pSub->pWhere!=0
10700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10710 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
10720 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
10730 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
10740 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
10750 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
10760 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  * iFrom-th entry
10770 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
10780 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72  use in the outer
10790 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20   query..  */..  
107a0 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74  /* Move all of t
107b0 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
107c0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
107d0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
107e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
107f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
10800 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
10810 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
10820 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
10830 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
10840 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
10850 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
10860 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
10870 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
10880 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
10890 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
108a0 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
108b0 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
108c0 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
108d0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
108e0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
108f0 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
10900 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
10910 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
10920 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
10930 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
10940 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
10950 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
10960 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
10970 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
10980 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
10990 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
109a0 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
109b0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
109c0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
109d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
109e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
109f0 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  ..    if( pTab &
10a00 26 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  & pTab->isTransi
10a10 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
10a20 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
10a30 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  0, pSubitem->pTa
10a40 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
10a50 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
10a60 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
10a70 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
10a80 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
10a90 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10aa0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
10ab0 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  ;.    if( nSubSr
10ac0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  c>1 ){.      int
10ad0 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63   extra = nSubSrc
10ae0 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   - 1;.      for(
10af0 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=1; i<nSubSrc; 
10b00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
10b10 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
10b20 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20  istAppend(pSrc, 
10b30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
10b40 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70       p->pSrc = p
10b50 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
10b60 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
10b70 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69  -extra>=iFrom; i
10b80 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  --){.        pSr
10b90 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e  c->a[i] = pSrc->
10ba0 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20  a[i-extra];.    
10bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
10bc0 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
10bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; i++){.      pS
10be0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
10bf0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
10c00 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
10c10 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
10c20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
10c30 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
10c40 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b    pSrc->a[iFrom+
10c50 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  nSubSrc-1].joint
10c60 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
10c70 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65    }..  /* Now be
10c80 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
10c90 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
10ca0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
10cb0 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72   for .  ** refer
10cc0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
10cd0 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
10ce0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20  r query..  ** . 
10cf0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
10d00 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20  *.  **   SELECT 
10d10 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
10d20 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
10d30 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
10d40 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
10d50 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
10d60 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
10d70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
10d80 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
10d90 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20           /.  ** 
10da0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
10db0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
10dc0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
10dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10de0 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ____/.  **.  ** 
10df0 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
10e00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
10e10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
10e20 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
10e30 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77  e see.  ** "a" w
10e40 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
10e50 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
10e60 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
10e70 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
10e80 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74  0"..  */.  subst
10e90 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
10ea0 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
10eb0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c  b->pEList);.  pL
10ec0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
10ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
10ee0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10ef0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
10f00 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
10f10 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
10f20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
10f30 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
10f40 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
10f50 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
10f60 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
10f70 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e  NDup(pExpr->span
10f80 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
10f90 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
10fa0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
10fb0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10fc0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
10fd0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10fe0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
10ff0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
11000 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11010 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
11020 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
11030 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
11040 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
11050 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
11060 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
11070 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
11080 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
11090 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
110a0 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
110b0 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
110c0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
110d0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
110e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
110f0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
11100 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11110 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
11120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
11130 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
11140 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
11150 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
11160 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
11170 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
11180 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
11190 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
111a0 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
111b0 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
111c0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
111d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
111e0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
111f0 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69  ExprAnd(p->pHavi
11200 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ng, sqlite3ExprD
11210 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
11220 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
11230 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
11240 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
11250 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
11260 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
11270 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  oupBy);.  }else{
11280 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
11290 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
112a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
112b0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
112c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
112d0 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  (p->pWhere, pWhe
112e0 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
112f0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
11300 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
11310 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
11320 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
11330 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
11340 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
11350 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
11360 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
11370 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
11380 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
11390 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
113a0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
113b0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
113c0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
113d0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
113e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
113f0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
11400 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
11410 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
11420 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
11430 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
11440 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
11450 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
11460 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
11470 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
11480 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
11490 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
114a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
114b0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
114c0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
114d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
114e0 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
114f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
11500 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
11510 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
11520 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
11530 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
11540 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
11550 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
11560 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
11570 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
11580 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
11590 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
115a0 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
115b0 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
115c0 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
115d0 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
115e0 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
115f0 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
11600 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
11610 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
11620 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
11630 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
11640 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
11650 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
11660 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
11670 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
11680 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
11690 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
116a0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
116b0 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
116c0 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
116d0 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
116e0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
116f0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
11700 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
11710 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
11720 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
11730 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
11740 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
11750 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
11760 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11770 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
11780 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
11790 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
117a0 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
117b0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
117c0 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
117d0 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
117e0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
117f0 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
11800 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11810 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
11820 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
11830 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
11840 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
11850 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
11860 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
11870 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
11880 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
11890 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
118a0 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
118b0 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
118c0 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e  int seekOp;.  in
118d0 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69  t cont;.  ExprLi
118e0 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69  st *pEList, *pLi
118f0 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  st, eList;.  str
11900 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11910 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53  m eListItem;.  S
11920 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20  rcList *pSrc;.. 
11930 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11940 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69   if this query i
11950 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
11960 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
11970 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65    Return.  ** ze
11980 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74  ro if it is  not
11990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
119a0 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70  pGroupBy || p->p
119b0 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68  Having || p->pWh
119c0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
119d0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
119e0 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
119f0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11a00 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
11a10 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
11a20 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
11a30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78   return 0;.  pEx
11a40 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
11a50 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
11a60 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
11a70 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
11a80 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20  rn 0;.  pList = 
11a90 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
11aa0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  if( pList==0 || 
11ab0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
11ac0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
11ad0 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
11ae0 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=3 ) return 0;.
11af0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11b00 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
11b10 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30  en.z,"min",3)==0
11b20 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
11b30 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65   OP_Rewind;.  }e
11b40 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
11b50 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74  trNICmp(pExpr->t
11b60 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d  oken.z,"max",3)=
11b70 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70  =0 ){.    seekOp
11b80 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65   = OP_Last;.  }e
11b90 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
11ba0 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d  0;.  }.  pExpr =
11bb0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
11bc0 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
11bd0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
11be0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f   return 0;.  iCo
11bf0 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
11c00 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  mn;.  pTab = pSr
11c10 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  c->a[0].pTab;.. 
11c20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   /* If we get to
11c30 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20   here, it means 
11c40 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
11c50 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d  the correct form
11c60 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ..  ** Check to 
11c70 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  make sure we hav
11c80 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d  e an index and m
11c90 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74  ake pIdx point t
11ca0 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f  o the.  ** appro
11cb0 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49  priate index.  I
11cc0 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  f the min() or m
11cd0 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e  ax() is on an IN
11ce0 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20  TEGER PRIMARY.  
11cf0 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e  ** key column, n
11d00 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73  o index is neces
11d10 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78  sary so set pIdx
11d20 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f   to NULL.  If no
11d30 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64  .  ** usable ind
11d40 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ex is found, ret
11d50 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
11d60 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
11d70 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pIdx = 0;.  }els
11d80 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e{.    CollSeq *
11d90 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
11da0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
11db0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66  e, pExpr);.    f
11dc0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
11dd0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11de0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
11df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
11e00 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b  x->nColumn>=1 );
11e10 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
11e20 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
11e30 6f 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49  ol && pIdx->keyI
11e40 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43  nfo.aColl[0]==pC
11e50 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  oll ) break;.   
11e60 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d   }.    if( pIdx=
11e70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11e80 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66   }..  /* Identif
11e90 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69  y column types i
11ea0 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
11eb0 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  ng the callback.
11ec0 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
11ed0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
11ee0 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
11ef0 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72  ng to a table or
11f00 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a   a memory cell..
11f10 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    ** The column 
11f20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  names have alrea
11f30 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
11f40 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  d in the calling
11f50 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
11f60 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11f70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11f80 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
11f90 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  n 0;..  /* If th
11fa0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
11fb0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
11fc0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
11fd0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
11fe0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
11ff0 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
12000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12010 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
12020 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
12030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12040 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
12050 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
12060 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
12070 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
12080 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
12090 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
120a0 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
120b0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
120c0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
120d0 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
120e0 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
120f0 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
12100 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
12110 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
12120 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
12130 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
12140 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
12150 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
12160 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
12170 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12180 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12190 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
121a0 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
121b0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d  ].iCursor;.  com
121c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
121d0 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
121e0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
121f0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
12200 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
12210 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20  leForReading(v, 
12220 62 61 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  base, pTab);.  }
12230 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
12240 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
12250 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
12260 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12270 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
12280 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
12290 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76  }else{.    /* Ev
122a0 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63 75  en though the cu
122b0 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65  rsor used to ope
122c0 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72 65  n the index here
122d0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a   is closed.    *
122e0 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73  * as soon as a s
122f0 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20  ingle value has 
12300 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69  been read from i
12310 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20  t, allocate it. 
12320 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61     ** using (pPa
12330 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20  rse->nTab++) to 
12340 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72 73  prevent the curs
12350 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67  or id from being
12360 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e   .    ** reused.
12370 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
12380 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt for statement
12390 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  s of the form . 
123a0 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e     ** "INSERT IN
123b0 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28  TO x SELECT max(
123c0 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a  ) FROM x"..    *
123d0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a  /.    int iIdx;.
123e0 20 20 20 20 69 49 64 78 20 3d 20 70 50 61 72 73      iIdx = pPars
123f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
12400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12410 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
12420 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Idx->iDb, 0);.  
12430 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
12440 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
12450 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75   iIdx, pIdx->tnu
12460 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
12470 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49        (char*)&pI
12480 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  dx->keyInfo, P3_
12490 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66  KEYINFO);.    if
124a0 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77  ( seekOp==OP_Rew
124b0 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ind ){.      sql
124c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
124d0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
124e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
124f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12500 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
12510 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20  );.      seekOp 
12520 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  = OP_MoveGt;.   
12530 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
12540 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
12550 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  p, iIdx, 0);.   
12560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12570 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f  p(v, OP_IdxRecno
12580 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
12590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
125b0 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
125c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
125d0 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c  OP_MoveGe, base,
125e0 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
125f0 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
12600 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
12610 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
12620 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
12630 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
12640 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
12650 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
12660 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12670 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
12680 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
12690 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
126a0 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71  , cont, 0);.  sq
126b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
126c0 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
126d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
126e0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
126f0 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72  base, 0);.  .  r
12700 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
12710 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
12720 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
12730 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53  BY clause in a S
12740 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
12750 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
12760 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
12770 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   seen..**.** An 
12780 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
12790 50 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f  P BY is a list o
127a0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  f expressions.  
127b0 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
127c0 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67  n.** is an integ
127d0 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
127e0 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
127f0 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
12800 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
12810 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
12820 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
12830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
12840 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
12850 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
12860 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  *pNC,     /* Nam
12870 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
12880 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12890 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  t. */.  ExprList
128a0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
128b0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
128c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
128d0 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
128e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
128f0 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45   *zType     /* E
12900 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72  ither "ORDER" or
12910 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70   "GROUP", as app
12920 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20  ropriate */.){. 
12930 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
12940 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43  st *pEList = pNC
12950 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a  ->pEList;     /*
12960 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12970 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
12980 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12990 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20   = pNC->pParse; 
129a0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
129b0 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
129c0 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ECT */.  assert(
129d0 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66   pEList );..  if
129e0 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
129f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
12a00 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
12a10 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12a20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
12a30 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
12a40 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
12a50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12a60 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
12a70 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
12a80 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
12a90 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
12aa0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
12ab0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
12ac0 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
12ad0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12ae0 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
12af0 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
12b00 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
12b10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12b30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12b40 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20  .           "%s 
12b50 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
12b60 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
12b70 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
12b80 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
12b90 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54  en 1 and %d", zT
12ba0 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73  ype, iCol, pELis
12bb0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
12bc0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12bd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12be0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
12bf0 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20  solveNames(pNC, 
12c00 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  pE) ){.      ret
12c10 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
12c20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12c30 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
12c40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12c50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
12c60 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59            "%s BY
12c70 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
12c80 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
12c90 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65  onstants", zType
12ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12cb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
12cc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
12ce0 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65  esolves any name
12cf0 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65  s used in the re
12d00 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a  sult set of the.
12d10 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45  ** supplied SELE
12d20 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66  CT statement. If
12d30 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12d40 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f  ement being reso
12d50 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62  lved.** is a sub
12d60 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f  -select, then pO
12d70 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e  uterNC is a poin
12d80 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43  ter to the NameC
12d90 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68  ontext .** of th
12da0 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e  e parent SELECT.
12db0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
12dc0 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20  electResolve(.  
12dd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12de0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12df0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
12e00 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12e20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12e30 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
12e40 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
12e50 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65  pOuterNC  /* The
12e60 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74   outer name cont
12e70 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ext. May be NULL
12e80 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  . */.){.  ExprLi
12e90 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
12ea0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73       /* Result s
12eb0 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  et. */.  int i; 
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20      /* For-loop 
12ee0 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e  variable used in
12ef0 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
12f00 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
12f10 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
12f20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63   /* Local name-c
12f30 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontext */..  /* 
12f40 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
12f50 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20  has run before, 
12f60 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
12f70 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ly. */.  if( p->
12f80 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20  isResolved ){.  
12f90 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74 65    assert( !pOute
12fa0 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  rNC );.    retur
12fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12fc0 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  .  p->isResolved
12fd0 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
12fe0 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61 64  here have alread
12ff0 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64  y been errors, d
13000 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
13010 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13020 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
13030 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13040 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65   }..  /* Prepare
13050 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
13060 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c  ement. This call
13070 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61   will allocate a
13080 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  ll cursors.  ** 
13090 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
130a0 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e  le the tables an
130b0 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  d subqueries in 
130c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
130d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70  .  */.  if( prep
130e0 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
130f0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
13100 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
13120 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
13130 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54  ons in the LIMIT
13140 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
13150 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20  ses. These.  ** 
13160 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
13170 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  to refer to any 
13180 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61  names, so pass a
13190 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74  n empty NameCont
131a0 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e  ext..  */.  sNC.
131b0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
131c0 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20 3d 20  .  sNC.hasAgg = 
131d0 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20 3d 20  0;.  sNC.nErr = 
131e0 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20 3d 20  0;.  sNC.nRef = 
131f0 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  0;.  sNC.pEList 
13200 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77  = 0;.  sNC.allow
13210 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 70  Agg = 0;.  sNC.p
13220 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20 20 73  SrcList = 0;.  s
13230 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
13240 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13250 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
13260 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
13270 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13280 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
13290 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
132a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
132b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
132c0 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
132d0 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
132e0 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
132f0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
13300 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
13310 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
13320 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
13330 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
13340 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
13350 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
13360 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
13370 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65 43 6f 6e 74  ;..  /* NameCont
13380 65 78 74 2e 6e 44 65 70 74 68 20 73 74 6f 72 65  ext.nDepth store
13390 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 72  s the depth of r
133a0 65 63 75 72 73 69 6f 6e 20 66 6f 72 20 74 68 69  ecursion for thi
133b0 73 20 71 75 65 72 79 2e 20 46 6f 72 0a 20 20 2a  s query. For.  *
133c0 2a 20 61 6e 20 6f 75 74 65 72 20 71 75 65 72 79  * an outer query
133d0 20 28 65 2e 67 2e 20 53 45 4c 45 43 54 20 2a 20   (e.g. SELECT * 
133e0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
133f0 65 72 29 20 74 68 69 73 20 69 73 20 31 2e 20 46  er) this is 1. F
13400 6f 72 0a 20 20 2a 2a 20 61 20 73 75 62 71 75 65  or.  ** a subque
13410 72 79 20 69 74 20 69 73 20 32 2e 20 46 6f 72 20  ry it is 2. For 
13420 61 20 73 75 62 71 75 65 72 79 20 6f 66 20 61 20  a subquery of a 
13430 73 75 62 71 75 65 72 79 2c 20 33 2e 20 41 6e 64  subquery, 3. And
13440 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a 2a 20 50 61   so on. .  ** Pa
13450 72 73 65 2e 6e 4d 61 78 44 65 70 74 68 20 69 73  rse.nMaxDepth is
13460 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70   the maximum dep
13470 74 68 20 66 6f 72 20 61 6e 79 20 73 75 62 71 75  th for any subqu
13480 65 72 79 20 72 65 73 6f 6c 76 65 64 20 73 6f 0a  ery resolved so.
13490 20 20 2a 2a 20 66 61 72 2e 20 54 68 69 73 20 69    ** far. This i
134a0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
134b0 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
134c0 66 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  f aggregate cont
134d0 65 78 74 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  exts.  ** requir
134e0 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 20  ed at runtime.. 
134f0 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44 65 70 74 68   */.  sNC.nDepth
13500 20 3d 20 28 70 4f 75 74 65 72 4e 43 3f 70 4f 75   = (pOuterNC?pOu
13510 74 65 72 4e 43 2d 3e 6e 44 65 70 74 68 2b 31 3a  terNC->nDepth+1:
13520 31 29 3b 0a 20 20 69 66 28 20 73 4e 43 2e 6e 44  1);.  if( sNC.nD
13530 65 70 74 68 3e 70 50 61 72 73 65 2d 3e 6e 4d 61  epth>pParse->nMa
13540 78 44 65 70 74 68 20 29 7b 0a 20 20 20 20 70 50  xDepth ){.    pP
13550 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20  arse->nMaxDepth 
13560 3d 20 73 4e 43 2e 6e 44 65 70 74 68 3b 0a 20 20  = sNC.nDepth;.  
13570 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
13580 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
13590 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
135a0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
135b0 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
135c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
135d0 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
135e0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
135f0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
13600 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
13610 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13620 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13630 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
13640 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
13650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13660 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
13670 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
13680 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
13690 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
136a0 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
136b0 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
136c0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
136d0 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
136e0 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
136f0 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
13700 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
13710 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
13720 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  ;.  if( p->pGrou
13730 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
13740 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
13750 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
13760 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
13770 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13780 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
13790 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
137a0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
137b0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
137c0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
137d0 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
137e0 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
137f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13800 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
13810 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
13820 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
13830 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
13840 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13850 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
13860 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13870 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
13880 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
13890 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
138a0 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
138b0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
138c0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
138d0 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
138e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
138f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13900 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
13910 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
13920 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
13930 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
13940 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
13950 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
13960 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
13970 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
13980 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
13990 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
139a0 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
139b0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
139c0 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
139d0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
139e0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
139f0 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
13a00 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73  here) ||.      s
13a10 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13a20 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
13a30 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20  pHaving) ||.    
13a40 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
13a50 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
13a60 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
13a70 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
13a80 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
13a90 73 4e 43 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  sNC, p->pGroupBy
13aa0 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a  , "GROUP").  ){.
13ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ac0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
13ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
13af0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
13b00 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 20 69  llowing struct i
13b10 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
13b20 33 53 65 6c 65 63 74 28 29 0a 2a 2a 20 74 6f 20  3Select().** to 
13b30 73 61 76 65 20 61 67 67 72 65 67 61 74 65 20 72  save aggregate r
13b40 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  elated informati
13b50 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  on from the Pars
13b60 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 74 20 74  e object.** at t
13b70 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
13b80 20 63 61 6c 6c 20 61 6e 64 20 74 6f 20 72 65 73   call and to res
13b90 74 6f 72 65 20 69 74 20 61 74 20 74 68 65 20 65  tore it at the e
13ba0 6e 64 2e 20 53 65 65 0a 2a 2a 20 73 61 76 65 41  nd. See.** saveA
13bb0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29 20 61  ggregateInfo() a
13bc0 6e 64 20 72 65 73 74 6f 72 65 41 67 67 72 65 67  nd restoreAggreg
13bd0 61 74 65 49 6e 66 6f 28 29 2e 0a 2a 2f 20 0a 73  ateInfo()..*/ .s
13be0 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49  truct AggregateI
13bf0 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 6e 41 67 67  nfo {.  int nAgg
13c00 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
13c10 67 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  g;.};.typedef st
13c20 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49 6e  ruct AggregateIn
13c30 66 6f 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f  fo AggregateInfo
13c40 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f 70 79 20 61  ;../* .** Copy a
13c50 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64  ggregate related
13c60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
13c70 6d 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  m the Parse stru
13c80 63 74 75 72 65 0a 2a 2a 20 69 6e 74 6f 20 74 68  cture.** into th
13c90 65 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  e AggregateInfo 
13ca0 73 74 72 75 63 74 75 72 65 2e 20 5a 65 72 6f 20  structure. Zero 
13cb0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 72 65  the aggregate re
13cc0 6c 61 74 65 64 0a 2a 2a 20 76 61 6c 75 65 73 20  lated.** values 
13cd0 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
13ce0 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  uct..*/.static v
13cf0 6f 69 64 20 73 61 76 65 41 67 67 72 65 67 61 74  oid saveAggregat
13d00 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
13d10 72 73 65 2c 20 41 67 67 72 65 67 61 74 65 49 6e  rse, AggregateIn
13d20 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 70 49  fo *pInfo){.  pI
13d30 6e 66 6f 2d 3e 61 41 67 67 20 3d 20 70 50 61 72  nfo->aAgg = pPar
13d40 73 65 2d 3e 61 41 67 67 3b 0a 20 20 70 49 6e 66  se->aAgg;.  pInf
13d50 6f 2d 3e 6e 41 67 67 20 3d 20 70 50 61 72 73 65  o->nAgg = pParse
13d60 2d 3e 6e 41 67 67 3b 0a 20 20 70 50 61 72 73 65  ->nAgg;.  pParse
13d70 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
13d80 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
13d90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 61 67  }../*.** Copy ag
13da0 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64 20  gregate related 
13db0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
13dc0 20 74 68 65 20 41 67 67 72 65 67 61 74 65 49 6e   the AggregateIn
13dd0 66 6f 20 73 74 72 75 63 74 0a 2a 2a 20 62 61 63  fo struct.** bac
13de0 6b 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  k into the Parse
13df0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
13e00 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65  aggregate relate
13e10 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
13e20 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
13e30 64 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  d in the Parse s
13e40 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
13e50 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
13e60 6f 69 64 20 72 65 73 74 6f 72 65 41 67 67 72 65  oid restoreAggre
13e70 67 61 74 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  gateInfo(Parse *
13e80 70 50 61 72 73 65 2c 20 41 67 67 72 65 67 61 74  pParse, Aggregat
13e90 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  eInfo *pInfo){. 
13ea0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72   sqliteFree(pPar
13eb0 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61  se->aAgg);.  pPa
13ec0 72 73 65 2d 3e 61 41 67 67 20 3d 20 70 49 6e 66  rse->aAgg = pInf
13ed0 6f 2d 3e 61 41 67 67 3b 0a 20 20 70 50 61 72 73  o->aAgg;.  pPars
13ee0 65 2d 3e 6e 41 67 67 20 3d 20 70 49 6e 66 6f 2d  e->nAgg = pInfo-
13ef0 3e 6e 41 67 67 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a  >nAgg;.}.  ./*.*
13f00 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13f10 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
13f20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
13f30 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
13f40 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
13f50 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
13f60 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
13f70 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
13f80 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
13f90 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
13fa0 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
13fb0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
13fc0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ff0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
14000 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
14010 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
14020 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
14030 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
14040 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
14050 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
14060 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
14070 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
14080 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
14090 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
140a0 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
140b0 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  f table iParm..*
140c0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
140d0 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
140e0 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
140f0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
14100 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
14110 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
14120 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
14130 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
14140 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
14150 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
14160 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
14170 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
14180 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
14190 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
141a0 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
141b0 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
141c0 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
141d0 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
141e0 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
141f0 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
14200 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
14210 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
14220 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
14230 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
14240 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
14250 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
14260 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
14270 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
14280 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
14290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
142a0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
142b0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
142c0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
142d0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
142e0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
142f0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
14300 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
14310 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
14320 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
14330 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
14340 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
14350 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
14360 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
14370 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
14380 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
14390 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
143a0 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
143b0 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
143c0 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
143d0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
143e0 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
143f0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
14400 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
14410 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
14420 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
14430 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
14440 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
14450 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
14460 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
14470 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
14480 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
14490 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
144a0 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
144b0 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
144c0 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
144d0 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
144e0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
144f0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
14500 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
14510 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
14520 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
14530 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
14540 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
14550 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
14560 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
14570 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
14580 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
14590 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
145a0 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
145b0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
145f0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
14600 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
14610 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
14620 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
14630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14640 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
14650 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
14660 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
14670 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
14680 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
14690 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
146a0 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
146b0 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
146c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
146d0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
146e0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
146f0 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
14700 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
14710 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
14720 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
14730 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
14740 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
14750 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
14760 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
14770 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
14780 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
14790 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
147a0 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
147b0 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
147c0 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
147d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
147e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
147f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
14800 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
14810 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
14820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14830 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14840 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
14850 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
14860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
14870 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
14880 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
14890 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
148a0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
148b0 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
148c0 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
148d0 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
148e0 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
148f0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
14900 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
14910 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
14920 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
14930 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
14940 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
14950 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
14960 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
14970 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
14980 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14990 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
149a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
149b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149d0 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
149e0 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
149f0 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
14a00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
14a10 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
14a20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
14a30 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
14a40 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
14a50 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
14a60 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
14a70 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14a80 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
14a90 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
14aa0 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
14ab0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
14ac0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
14ad0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
14ae0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
14af0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
14b00 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14b10 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
14b20 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
14b30 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
14b40 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
14b50 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
14b60 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
14b70 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
14b80 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
14b90 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
14ba0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
14bb0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
14bc0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
14bd0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
14be0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
14bf0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
14c00 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
14c10 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
14c20 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
14c30 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
14c40 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14c50 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
14c60 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
14c70 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
14c80 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
14c90 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
14ca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
14cb0 20 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20    AggregateInfo 
14cc0 73 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  sAggInfo;..  if(
14cd0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
14ce0 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  failed || pParse
14cf0 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29  ->nErr || p==0 )
14d00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
14d10 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14d20 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14d30 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
14d40 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 23  ) ) return 1;..#
14d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14d60 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
14d70 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
14d80 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
14d90 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
14da0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
14db0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
14dc0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
14dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
14de0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
14df0 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
14e00 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64  , aff);.  }.#end
14e10 69 66 0a 0a 20 20 73 61 76 65 41 67 67 72 65 67  if..  saveAggreg
14e20 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ateInfo(pParse, 
14e30 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 70 4f  &sAggInfo);.  pO
14e40 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14e50 65 72 42 79 3b 0a 20 20 69 66 28 20 65 44 65 73  erBy;.  if( eDes
14e60 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
14e70 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
14e80 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
14e90 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 70  Discard ){.    p
14ea0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14eb0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
14ec0 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
14ed0 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
14ee0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14ef0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
14f00 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14f10 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
14f20 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
14f30 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
14f40 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
14f50 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
14f60 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
14f70 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
14f80 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
14f90 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
14fa0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
14fb0 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
14fc0 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
14fd0 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
14fe0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
14ff0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
15000 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
15010 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
15020 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
15030 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
15040 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
15050 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
15060 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
15070 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
15080 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
15090 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
150a0 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
150b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
150c0 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
150d0 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
150e0 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
150f0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
15100 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
15110 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  put..  */.  asse
15120 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  rt( eDest!=SRT_E
15130 78 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d  xists || pEList-
15140 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 23 69 66  >nExpr==1 );.#if
15150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15160 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
15170 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
15180 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
15190 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
151a0 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
151b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
151c0 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
151d0 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
151e0 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
151f0 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
15200 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
15210 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
15220 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15230 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15240 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
15250 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
15260 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
15270 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
15280 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
15290 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
152a0 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
152b0 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
152c0 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
152d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
152e0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
152f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15300 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
15310 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
15320 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
15330 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15340 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
15350 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15360 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
15370 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
15380 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
15390 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
153a0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
153b0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
153c0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
153d0 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
153e0 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
153f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15400 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
15410 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
15420 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15430 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
15440 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
15450 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
15460 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
15470 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
15480 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
15490 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
154a0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
154b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
154c0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
154d0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
154e0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
154f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15500 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
15510 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
15520 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
15530 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ..    if( pTabLi
15540 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
15550 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
15560 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
15570 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20  ->a[i].zName!=0 
15580 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
15590 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
155a0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
155b0 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
155c0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
155d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
155e0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
155f0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
15600 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15610 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
15620 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
15630 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
15640 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
15650 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
15660 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
15670 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
15680 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
15690 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
156a0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
156b0 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
156c0 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
156d0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
156e0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
156f0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
15700 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
15710 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
15720 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
15730 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
15740 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
15750 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
15760 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
15770 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
15780 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
15790 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
157a0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
157b0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
157c0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
157d0 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
157e0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
157f0 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
15800 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
15810 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
15820 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
15830 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
15840 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
15850 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
15860 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
15870 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
15880 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
15890 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
158a0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
158b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
158c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
158d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
158e0 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
158f0 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
15900 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
15910 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
15920 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
15930 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
15940 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
15950 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
15960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
15970 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
15980 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
15990 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
159a0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
159b0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
159c0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
159d0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
159e0 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
159f0 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
15a00 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15a10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15a20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
15a30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15a40 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c   resolve any col
15a50 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
15a60 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74  .  ** names that
15a70 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69   have been expli
15a80 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2e  citly specified.
15a90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
15aa0 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
15ab0 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
15ac0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
15ad0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
15ae0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
15af0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
15b00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
15b10 6f 6c 6c 20 3d 20 0a 20 20 20 20 20 20 20 20 20  oll = .         
15b20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
15b30 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15b40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
15b50 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Name, -1);.     
15b60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15b70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
15b80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
15b90 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
15ba0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15bb0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
15bc0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
15bd0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
15be0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  ;..  /* If the o
15bf0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
15c00 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
15c10 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
15c20 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
15c30 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
15c40 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
15c50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c60 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
15c70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
15c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c90 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
15ca0 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45  lumns, iParm, pE
15cb0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
15cc0 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e  }..  /* Do an an
15cd0 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67  alysis of aggreg
15ce0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
15cf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
15d00 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b  g || pGroupBy ){
15d10 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
15d20 20 73 4e 43 3b 0a 20 20 20 20 6d 65 6d 73 65 74   sNC;.    memset
15d30 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
15d40 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
15d50 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
15d60 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
15d70 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20  t = pTabList;.. 
15d80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15d90 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20  e->nAgg==0 );.  
15da0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
15db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
15dc0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15dd0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
15de0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
15df0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 45  regates(&sNC, pE
15e00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
15e20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15e40 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
15e50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15e60 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
15e70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15e80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
15e90 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
15ea0 28 26 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2d  (&sNC, pGroupBy-
15eb0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
15ec0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
15ed0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
15ee0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15ef0 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
15f00 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
15f10 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
15f20 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
15f30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15f40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15f50 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
15f60 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
15f70 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
15f80 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
15f90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15fa0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
15fb0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 4f 72  egates(&sNC, pOr
15fc0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
15fd0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
15fe0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
15ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16000 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16010 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  /* Reset the agg
16020 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69  regator.  */.  i
16030 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
16040 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
16050 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16060 50 5f 41 67 67 52 65 73 65 74 2c 20 28 70 47 72  P_AggReset, (pGr
16070 6f 75 70 42 79 3f 30 3a 31 29 2c 20 70 50 61 72  oupBy?0:1), pPar
16080 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66  se->nAgg);.    f
16090 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
160a0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
160b0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
160c0 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  nc;.      if( (p
160d0 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61  Func = pParse->a
160e0 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30  Agg[i].pFunc)!=0
160f0 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61   && pFunc->xFina
16100 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
16110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16120 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c  3(v, OP_AggInit,
16130 20 30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46   0, i, (char*)pF
16140 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
16150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16160 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
16170 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
16180 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
16190 6f 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e  o) + pGroupBy->n
161a0 45 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  Expr*sizeof(Coll
161b0 53 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79  Seq*);.      Key
161c0 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
161d0 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61  yInfo *)sqliteMa
161e0 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
161f0 69 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20  if( 0==pKey ){. 
16200 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
16210 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
16220 20 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20        pKey->enc 
16230 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
16240 63 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e  c;.      pKey->n
16250 46 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79  Field = pGroupBy
16260 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66  ->nExpr;.      f
16270 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
16280 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
16290 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  .        pKey->a
162a0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
162b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
162c0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
162d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
162e0 20 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61      if( !pKey->a
162f0 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
16300 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
16310 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  [i] = pParse->db
16320 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
16330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16350 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
16360 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20  , (char *)pKey, 
16370 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
16380 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  FF);.    }.  }..
16390 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
163a0 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
163b0 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 53 52 54 5f  to NULL for SRT_
163c0 4d 65 6d 20 6f 72 20 30 20 66 6f 72 20 53 52 54  Mem or 0 for SRT
163d0 5f 45 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 69  _Exists.  */.  i
163e0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  f( eDest==SRT_Me
163f0 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
16400 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 73 71  Exists ){.    sq
16410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16420 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  , eDest==SRT_Mem
16430 20 3f 20 4f 50 5f 53 74 72 69 6e 67 38 20 3a 20   ? OP_String8 : 
16440 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
16450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16460 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16470 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
16480 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
16490 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
164a0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
164b0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
164c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
164d0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
164e0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
164f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 70 65  >nTab++;.    ope
16500 6e 54 65 6d 70 49 6e 64 65 78 28 70 50 61 72 73  nTempIndex(pPars
16510 65 2c 20 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  e, p, distinct, 
16520 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
16530 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
16540 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
16550 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
16560 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  n.  */.  pWInfo 
16570 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
16580 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
16590 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 0a 20 20  List, pWhere,.  
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75             pGrou
165c0 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65  pBy ? 0 : &pOrde
165d0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  rBy);.  if( pWIn
165e0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
165f0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55  ect_end;..  /* U
16600 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
16610 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65  inner loop if we
16620 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67   are not dealing
16630 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65   with.  ** aggre
16640 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28  gates.  */.  if(
16650 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69   !isAgg ){.    i
16660 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
16670 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
16680 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
16690 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
166a0 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
166b0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
166c0 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
166d0 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
166e0 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  eak, aff) ){.   
166f0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
16700 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
16710 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
16720 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72  ealing with aggr
16730 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20  egates, then do 
16740 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72  the special aggr
16750 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65  egate.  ** proce
16760 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20  ssing.  .  */.  
16770 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70  else{.    AggExp
16780 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 6e 74  r *pAgg;.    int
16790 20 6c 62 6c 31 20 3d 20 30 3b 0a 20 20 20 20 70   lbl1 = 0;.    p
167a0 50 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d  Parse->fillAgg =
167b0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   1;.    if( pGro
167c0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  upBy ){.      fo
167d0 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
167e0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
167f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16800 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16810 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
16820 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
16830 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e       /* No affin
16840 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74  ity string is at
16850 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f  tached to the fo
16860 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52  llowing OP_MakeR
16870 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a 20  ecord .      ** 
16880 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f  because we do no
16890 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79  t need to do any
168a0 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74   coercion of dat
168b0 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20  atypes. */.     
168c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168d0 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
168e0 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  rd, pGroupBy->nE
168f0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c  xpr, 0);.      l
16900 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl1 = sqlite3Vdb
16910 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
16920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16930 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
16940 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a  ocus, 0, lbl1);.
16950 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
16960 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e  0, pAgg=pParse->
16970 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e  aAgg; i<pParse->
16980 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b  nAgg; i++, pAgg+
16990 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41  +){.      if( pA
169a0 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
169b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
169c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
169d0 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29  se, pAgg->pExpr)
169e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
169f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
16a00 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
16a10 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
16a20 66 69 6c 6c 41 67 67 20 3d 20 30 3b 0a 20 20 20  fillAgg = 0;.   
16a30 20 69 66 28 20 6c 62 6c 31 3c 30 20 29 7b 0a 20   if( lbl1<0 ){. 
16a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16a50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16a60 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
16a70 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
16a80 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
16a90 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
16aa0 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
16ab0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
16ac0 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
16ad0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
16ae0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
16af0 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
16b00 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
16b10 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30  ( pAgg->pFunc!=0
16b20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16b30 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78  ( pAgg->pFunc->x
16b40 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
16b50 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46   pDef = pAgg->pF
16b60 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  unc;.      pE = 
16b70 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAgg->pExpr;.   
16b80 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
16b90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16ba0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
16bb0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
16bc0 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
16bd0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
16be0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
16bf0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
16c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16c10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
16c20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
16c30 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
16c40 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
16c50 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
16c60 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
16c70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21        for(j=0; !
16c80 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72  pColl && j<nExpr
16c90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
16ca0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
16cb0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16cc0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
16cd0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
16ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16cf0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
16d00 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
16d10 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16d30 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
16d40 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
16d50 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
16d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16d70 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16d80 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
16d90 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29  , nExpr, (char*)
16da0 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46  pDef, P3_FUNCDEF
16db0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16dc0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
16dd0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
16de0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
16df0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
16e00 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
16e10 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
16e20 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
16e30 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
16e40 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
16e50 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
16e60 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
16e70 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
16e80 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
16e90 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
16ea0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16eb0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16ec0 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20  int startagg;.  
16ed0 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c    startagg = sql
16ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16ef0 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
16f00 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 69 66 28  endagg);.    if(
16f10 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
16f20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
16f30 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
16f40 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
16f50 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
16f60 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
16f70 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
16f80 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
16f90 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
16fa0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
16fb0 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
16fc0 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
16fd0 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20  g, aff) ){.     
16fe0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
16ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17000 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17010 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72  OP_Goto, 0, star
17020 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tagg);.    sqlit
17030 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17040 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
17050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17060 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
17070 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
17080 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
17090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
170a0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
170b0 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
170c0 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
170d0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
170e0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
170f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
17100 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
17110 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
17120 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
17130 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
17140 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69   iParm);.  }..#i
17150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17160 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
17170 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
17180 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
17190 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
171a0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
171b0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
171c0 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65   table.  So dele
171d0 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  te the subquery 
171e0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
171f0 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74  he parent.  ** t
17200 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73  o prevent this s
17210 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
17220 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
17230 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
17240 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  the.  ** the use
17250 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
17260 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
17270 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
17280 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
17290 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
172a0 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
172b0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
172c0 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
172d0 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
172e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
172f0 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
17300 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
17310 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
17320 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  elect = 0;.  }.#
17330 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20  endif..  /* The 
17340 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
17350 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
17360 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
17370 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
17380 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
17390 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
173a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
173b0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
173c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
173d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
173e0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
173f0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
17400 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
17410 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
17420 3a 0a 20 20 72 65 73 74 6f 72 65 41 67 67 72 65  :.  restoreAggre
17430 67 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  gateInfo(pParse,
17440 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 72   &sAggInfo);.  r
17450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.