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

Artifact 6217e1f72cee7e173b21b252fd42a052f3b4decc:


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 33 39  select.c,v 1.239
0200: 20 32 30 30 35 2f 30 32 2f 30 35 20 31 32 3a 34   2005/02/05 12:4
0210: 38 3a 34 38 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:48 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 61 73        }.      as
56f0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
5700: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5710: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5720: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5730: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5740: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5750: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5760: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5770: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
5780: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
5790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
57a0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
57b0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
57c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
57d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
57e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
57f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
5800: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
5810: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
5820: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
5830: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
5840: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
5850: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5860: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
5870: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
5880: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
5890: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
58a0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
58b0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
58c0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
58d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
58e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
58f0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
5900: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
5910: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
5920: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
5930: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
5940: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
5950: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
5960: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5970: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
5980: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5990: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
59a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
59b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
59c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
59d0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
59e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
59f0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5a00: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
5a10: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
5a20: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
5a30: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5a40: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5a50: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
5a60: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
5a70: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
5a80: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
5a90: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5aa0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5ab0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
5ac0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5ae0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
5af0: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
5b00: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
5b10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
5b20: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
5b30: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
5b40: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
5b50: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
5b60: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
5b70: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
5b80: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
5b90: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
5ba0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5bb0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
5bc0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
5bd0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
5be0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
5bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5c00: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5c10: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5c20: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5c30: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5c40: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
5c50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
5c60: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
5c70: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
5c80: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
5c90: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5ca0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
5cb0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
5cc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5cd0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5ce0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
5cf0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
5d00: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
5d10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5d20: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
5d30: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
5d40: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
5d50: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5d60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5d70: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
5d80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5d90: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
5da0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
5db0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
5dc0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5dd0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5de0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
5df0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
5e00: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5e10: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
5e20: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
5e30: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5e40: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
5e50: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
5e60: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
5e70: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5e80: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5e90: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5ea0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
5eb0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5ec0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
5ed0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
5ee0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5ef0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
5f00: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
5f10: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5f20: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
5f30: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
5f40: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5f60: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
5f70: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5f80: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5f90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5fa0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5fb0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5fc0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5fd0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ff0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6000: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
6010: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
6020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6030: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
6040: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
6050: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
6060: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
6070: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
6080: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
6090: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
60a0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
60b0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
60c0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
60d0: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
60e0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
60f0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
6100: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
6110: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6120: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
6130: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
6140: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
6150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
6160: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
6170: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
6180: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
6190: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
61a0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
61b0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
61c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
61d0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
61e0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
61f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
6200: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
6210: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
6220: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6230: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
6240: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6250: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
6260: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
6270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6280: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
6290: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
62a0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
62c0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
62d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
62e0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
62f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6300: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
6310: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
6320: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6330: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6350: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
6360: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
6370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
6380: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6390: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
63a0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
63b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
63d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
63e0: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
63f0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
6400: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6410: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6420: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
6430: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6440: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
6450: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
6460: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
6470: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
6480: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
6490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64a0: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
64b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
64c0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
64d0: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
64e0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
64f0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
6500: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
6510: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6520: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6530: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
6540: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
6550: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
6560: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
6570: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6580: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6590: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
65a0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
65b0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
65c0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
65d0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
65e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
65f0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
6600: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
6610: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
6620: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
6630: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
6640: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
6650: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
6660: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
6670: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
6680: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
6690: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
66a0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
66b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
66c0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
66d0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
66e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
66f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6700: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6710: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
6720: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
6730: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
6740: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
6750: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
6760: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
6770: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6780: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6790: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
67a0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
67b0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
67c0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
67d0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
67e0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
67f0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
6800: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
6810: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
6820: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6830: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
6840: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
6850: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
6860: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
6870: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
6880: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
6890: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
68a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
68b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
68c0: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65  olve(pParse, pSe
68d0: 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  lect, 0) ){.    
68e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
68f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
6900: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
6910: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6920: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6930: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
6940: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6950: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6960: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6970: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6980: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6990: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
69a0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
69b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
69c0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
69d0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
69e0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
69f0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
6a00: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
6a10: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
6a20: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6a30: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
6a40: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
6a50: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
6a60: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
6a70: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  ;.    char *zBas
6a80: 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63  ename;.    int c
6a90: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
6aa0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
6ab0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
6ac0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
6ad0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
6ae0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
6af0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
6b00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
6b10: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
6b20: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
6b30: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
6b40: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
6b50: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
6b60: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6b70: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
6b80: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
6b90: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
6ba0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
6bb0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
6bc0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
6bd0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6be0: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
6bf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
6c00: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
6c10: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
6c20: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
6c30: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
6c40: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
6c50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
6c60: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
6c70: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
6c80: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
6c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
6ca0: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
6cb0: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
6cc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
6cd0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
6ce0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
6cf0: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
6d00: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
6d10: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
6d20: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
6d30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
6d40: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
6d50: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
6d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
6d70: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
6d80: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
6d90: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6da0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
6db0: 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  tf("column%d", i
6dc0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
6dd0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
6de0: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
6df0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
6e00: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
6e10: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
6e20: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
6e30: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
6e40: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
6e50: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
6e60: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
6e70: 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61    */.    zBasena
6e80: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
6e90: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
6ea0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
6eb0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ec0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6ed0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
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 73 3a  ite3MPrintf("%s:
6f00: 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20  %d", zBasename, 
6f10: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
6f20: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  j = -1;.      }.
6f30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42      }.    if( zB
6f40: 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29  asename!=zName )
6f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6f60: 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20  ee(zBasename);. 
6f70: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
6f80: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
6f90: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
6fa0: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
6fb0: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
6fc0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
6fd0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
6fe0: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
6ff0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7000: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
7010: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
7020: 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70  StrDup(columnTyp
7030: 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20  e(&sNC, p));.   
7040: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
7050: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
7060: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
7070: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
7080: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  );.    pCol->pCo
7090: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
70a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
70b0: 70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  p);.    if( !pCo
70c0: 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  l->pColl ){.    
70d0: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
70e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
70f0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  tColl;.    }.  }
7100: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
7110: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54   -1;.  return pT
7120: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ab;.}../*.** Pre
7130: 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74  pare a SELECT st
7140: 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
7150: 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20  essing by doing 
7160: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
7170: 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20   things:.**.**  
7180: 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
7190: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
71a0: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
71b0: 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
71c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
71d0: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
71e0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
71f0: 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
7200: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
7210: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
7220: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
7230: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
7240: 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
7250: 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
7260: 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
7270: 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
7280: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
7290: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
72a0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
72b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
72c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
72d0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
72e0: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
72f0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
7300: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
7310: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
7320: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
7330: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
7340: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
7350: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
7360: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
7370: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
7380: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
7390: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
73a0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
73b0: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
73c0: 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
73d0: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
73e0: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
73f0: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
7400: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
7410: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
7420: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
7430: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
7440: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
7450: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
7460: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7470: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
7480: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
7490: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
74a0: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
74b0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
74c0: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
74d0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
74e0: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
74f0: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
7500: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
7510: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
7520: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
7530: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
7540: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
7550: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
7560: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
7570: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
7580: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
7590: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
75a0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
75b0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
75c0: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
75d0: 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61  tStmt(Parse *pPa
75e0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
75f0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
7600: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
7610: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
7620: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
7630: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74  able *pTab;.  st
7640: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7650: 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28  m *pFrom;..  if(
7660: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
7670: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
7680: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
7690: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
76a0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
76b0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
76c0: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
76d0: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
76e0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
76f0: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
7700: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
7710: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
7720: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
7730: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
7740: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
7750: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
7760: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
7770: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
7780: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
7790: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
77a0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
77b0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
77c0: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
77d0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
77e0: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
77f0: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
7800: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
7810: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
7820: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
7830: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
7840: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
7850: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7860: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
7870: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
7880: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
7890: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
78a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
78b0: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
78c0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
78d0: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
78e0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
78f0: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
7900: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
7910: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
7920: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
7930: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7940: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7950: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
7960: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
7970: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
7980: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
7990: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
79a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
79b0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
79c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
79d0: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
79e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
79f0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
7a00: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
7a10: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
7a20: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
7a30: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
7a40: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7a50: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
7a60: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7a70: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
7a80: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
7a90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7ab0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7ac0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
7ad0: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
7ae0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
7af0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7b00: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
7b10: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
7b20: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
7b30: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
7b40: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
7b50: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
7b60: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
7b70: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
7b80: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
7b90: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
7ba0: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
7bb0: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
7bc0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
7bd0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
7be0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
7bf0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
7c00: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
7c10: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
7c20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7c30: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
7c40: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
7c50: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
7c60: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
7c70: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
7c80: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
7c90: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
7ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7cb0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69  rn 1;.      }.#i
7cc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7cd0: 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28  T_VIEW.      if(
7ce0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
7cf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
7d00: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
7d10: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
7d20: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
7d30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7d40: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
7d50: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
7d60: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
7d70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d90: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
7da0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
7db0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
7dc0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
7dd0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
7de0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
7df0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
7e00: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7e10: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
7e20: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
7e30: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
7e40: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
7e50: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
7e60: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
7e70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7e80: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
7e90: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
7ea0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
7eb0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7ec0: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
7ed0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7ee0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
7ef0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
7f00: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
7f10: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
7f20: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7f30: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
7f40: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
7f50: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
7f60: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
7f70: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
7f80: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
7f90: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
7fa0: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
7fb0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
7fc0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7fd0: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
7fe0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
7ff0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
8000: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
8010: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
8020: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
8030: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
8040: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
8050: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
8060: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
8070: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
8080: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
8090: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
80a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
80b0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
80c0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
80d0: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
80e0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
80f0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
8100: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
8110: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
8120: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
8130: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
8140: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
8150: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
8160: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
8170: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
8180: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
8190: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
81a0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
81b0: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
81c0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
81d0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
81e0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
81f0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
8200: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
8210: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
8220: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
8230: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
8240: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
8250: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
8260: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
8270: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
8280: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
8290: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
82a0: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
82b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
82c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
82d0: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
82e0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
82f0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
8300: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
8310: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8320: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
8330: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
8340: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
8350: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
8360: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8370: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
8380: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
8390: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
83a0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
83b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
83c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
83d0: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
83e0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
83f0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
8400: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
8410: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
8420: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
8430: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
8440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
8450: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
8460: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
8470: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
8480: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
8490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
84a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
84b0: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61  stAppend(pNew, a
84c0: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
84d0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
84e0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
84f0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
8500: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  ;.        a[k].p
8510: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
8520: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
8530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8540: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
8550: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
8560: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
8570: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
8580: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
8590: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
85a0: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
85b0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
85c0: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
85d0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
85e0: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
85f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8600: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
8610: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
8620: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
8630: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
8640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
8650: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
8660: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d  meFromToken(&pE-
8670: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
8680: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8690: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
86a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
86b0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
86c0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
86d0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
86e0: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
86f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
8700: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
8710: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
8720: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
8730: 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
8740: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
8750: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
8760: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
8770: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
8780: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
8790: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
87a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
87b0: 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62   zTName && (zTab
87c0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
87d0: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20  ame[0]==0 || .  
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
87f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
8800: 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
8810: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
8820: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8840: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
8850: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
8860: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
8870: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
8880: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
8890: 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  , *pLeft, *pRigh
88a0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
88b0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
88c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
88d0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
88e0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
88f0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
8900: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
8910: 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  ft = &pTabList->
8920: 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  a[i-1];.        
8930: 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74        if( (pLeft
8940: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
8950: 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20  NATURAL)!=0 &&. 
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
8980: 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20  ex(pLeft->pTab, 
8990: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
89c0: 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
89d0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
89e0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
89f0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
8a00: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8a20: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
8a50: 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74  dListIndex(pLeft
8a60: 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
8a70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
8a80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
8a90: 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
8aa0: 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
8ab0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8ad0: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
8ae0: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
8af0: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8b10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8b40: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
8b50: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
8b60: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
8b70: 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30     if( pRight==0
8b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8b90: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
8ba0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
8bb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8bc0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
8bd0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8be0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
8bf0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
8c00: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
8c10: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
8c20: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
8c30: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
8c40: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
8c50: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
8c60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
8c70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
8c80: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
8c90: 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c  n(&pLeft->token,
8ca0: 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
8cb0: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
8cc0: 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  en(&pExpr->span,
8cd0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8ce0: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
8cf0: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
8d00: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8d10: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8d30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
8d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8d50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
8d60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
8d70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
8d80: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8da0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
8db0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
8dc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
8dd0: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
8de0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
8e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8e10: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70  stAppend(pNew, p
8e20: 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74  Expr, &pRight->t
8e30: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
8e40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8e50: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
8e60: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
8e70: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
8e80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8e90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8ea0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
8eb0: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
8ee0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ef0: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
8f00: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
8f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f20: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8f40: 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29  liteFree(zTName)
8f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8f70: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
8f80: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
8f90: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
8fa0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8fb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8fc0: 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69  recursively unli
8fd0: 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70  nks the Select.p
8fe0: 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69  Src.a[].pTab poi
8ff0: 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65  nters.** in a se
9000: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
9010: 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
9020: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55  e pointers to NU
9030: 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  LL.  This.** rou
9040: 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76  tine is recursiv
9050: 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  e in the sense t
9060: 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63  hat if the Selec
9070: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65  t.pSrc.a[].pSele
9080: 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73  ct.** pointer is
9090: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20   not NULL, this 
90a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
90b0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
90c0: 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a   that pointer..*
90d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
90e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  e is called on t
90f0: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
9100: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
9110: 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72   a.** VIEW in or
9120: 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20  der to undo any 
9130: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c  bindings to tabl
9140: 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  es.  This is nec
9150: 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73  essary.** becaus
9160: 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d  e those tables m
9170: 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62  ight be DROPed b
9180: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53  y a subsequent S
9190: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49  QL command..** I
91a0: 66 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61  f the bindings a
91b0: 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20  re not removed, 
91c0: 74 68 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  then the Select.
91d0: 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  pSrc->a[].pTab f
91e0: 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ield.** will be 
91f0: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
9200: 20 61 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54   a deallocated T
9210: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
9220: 66 74 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50  fter the.** DROP
9230: 20 61 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20   and a coredump 
9240: 77 69 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e  will occur the n
9250: 65 78 74 20 74 69 6d 65 20 74 68 65 20 56 49 45  ext time the VIE
9260: 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  W is used..*/.#i
9270: 66 20 30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  f 0.void sqlite3
9280: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
9290: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
92a0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
92b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73  c = p->pSrc;.  s
92c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
92d0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 54 61 62  em *pItem;.  Tab
92e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
92f0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
9300: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
9310: 70 53 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63 2d  pSrc->a; i<pSrc-
9320: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
9330: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
9340: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
9350: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  b)!=0 ){.      i
9360: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
9370: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ient ){.        
9380: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
9390: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
93a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
93b0: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
93c0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
93d0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
93e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
93f0: 69 6e 64 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ind(pItem->pSele
9400: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
9410: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9430: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9440: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
9450: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
9460: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
9470: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
9480: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
9490: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
94a0: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
94b0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
94c0: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
94d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
94e0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
94f0: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
9500: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
9510: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
9520: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
9530: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
9540: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
9550: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
9560: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
9570: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
9580: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
9590: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
95a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
95b0: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
95c0: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
95d0: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
95e0: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
95f0: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
9600: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
9610: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
9620: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
9630: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
9640: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
9650: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
9660: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
9670: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
9680: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
9690: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
96a0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
96b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
96c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
96d0: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
96e0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
96f0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
9700: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
9710: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
9720: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
9730: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
9740: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
9750: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
9760: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
9770: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
9780: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
9790: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
97a0: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
97b0: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
97c0: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
97d0: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
97e0: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
97f0: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
9800: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
9810: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
9820: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9830: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
9840: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
9850: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
9860: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
9870: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
9880: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9890: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
98a0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
98b0: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
98c0: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
98d0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
98e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
98f0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
9900: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
9910: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
9920: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
9930: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
9940: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
9950: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
9960: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9970: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
9980: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
9990: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
99a0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
99b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
99c0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
99d0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
99e0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
99f0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
9a00: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
9a10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9a20: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
9a30: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
9a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
9a50: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
9a60: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
9a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9a80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9a90: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
9aa0: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
9ab0: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
9ac0: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
9ad0: 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73       iCol, pELis
9ae0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
9af0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9b10: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73  }.      if( !mus
9b20: 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74  tComplete ) cont
9b30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c  inue;.      iCol
9b40: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
9b50: 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26  r(j=0; iCol<0 &&
9b60: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
9b70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9b80: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ( pEList->a[j].z
9b90: 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d  Name && (pE->op=
9ba0: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70  =TK_ID || pE->op
9bb0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a  ==TK_STRING) ){.
9bc0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
9bd0: 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20  ame, *zLabel;.  
9be0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
9bf0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9c00: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c  ;.        zLabel
9c10: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
9c20: 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b  omToken(&pE->tok
9c30: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  en);.        ass
9c40: 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29  ert( zLabel!=0 )
9c50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
9c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
9c70: 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29  me, zLabel)==0 )
9c80: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  { .          iCo
9c90: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d  l = j;.        }
9ca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9cb0: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
9cc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9cd0: 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33  Col<0 && sqlite3
9ce0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20  ExprCompare(pE, 
9cf0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
9d00: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pr) ){.        i
9d10: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  Col = j;.      }
9d20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9d30: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
9d40: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
9d50: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43  MN;.      pE->iC
9d60: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
9d70: 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d      pE->iTable =
9d80: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70   iTable;.      p
9d90: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9da0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
9db0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
9dc0: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
9dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9de0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9df0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9e00: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
9e10: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9e20: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
9e30: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
9e40: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
9e50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
9e60: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
9e70: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
9e80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9e90: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9ea0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
9eb0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
9ec0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
9ed0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
9ee0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9ef0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9f00: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9f10: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
9f20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9f30: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
9f40: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
9f50: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
9f60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9f70: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
9f80: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
9f90: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
9fa0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
9fb0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
9fc0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
9fd0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9fe0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9ff0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
a000: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
a010: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
a020: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
a030: 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74 20  ssions.  nLimit 
a040: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
a050: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
a060: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
a070: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
a080: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
a090: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
a0a0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
a0b0: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
a0c0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
a0d0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
a0e0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a0f0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
a100: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
a110: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
a120: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
a130: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
a140: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a150: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
a160: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
a170: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
a180: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
a190: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
a1a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a1b0: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
a1c0: 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d  e values if iLim
a1d0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
a1e0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
a1f0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
a200: 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74  efined by nLimit
a210: 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20 69   and nOffset.  i
a220: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
a230: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
a240: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
a250: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
a260: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
a270: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
a280: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
a290: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
a2a0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
a2b0: 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72   if nLimit>=0 or
a2c0: 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20 74 68   nOffset>0 do th
a2d0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
a2e0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
a2f0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
a300: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
a310: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
a320: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
a330: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
a340: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
a350: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
a360: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
a370: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
a380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a390: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
a3a0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
a3b0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
a3c0: 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  {.  /* .  ** "LI
a3d0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
a3e0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
a3f0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
a400: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
a410: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
a420: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
a430: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
a440: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
a450: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
a460: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
a470: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
a480: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
a490: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
a4a0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
a4b0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
a4c0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
a4d0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a4e0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a4f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
a500: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a510: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
a520: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
a540: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
a550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a560: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
a570: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
a580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a590: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a5a0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
a5b0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
a5c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
a5d0: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
a5e0: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
a5f0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
a600: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
a610: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a620: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
a630: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a640: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a650: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a660: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a670: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
a680: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
a690: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a6a0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
a6b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a6c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
a6d0: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
a6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6f0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
a700: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
a710: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a720: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
a730: 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  er"));.    p->iO
a740: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
a750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a760: 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75 63  ate VDBE instruc
a770: 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  tions that will 
a780: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
a790: 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 77   table that.** w
a7a0: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
a7b0: 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 73  an index or to s
a7c0: 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75 6c  tore keyed resul
a7d0: 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ts for a compoun
a7e0: 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49 6e  d.** select.  In
a7f0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 70   other words, op
a800: 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  en a transient t
a810: 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20  able that needs 
a820: 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  a.** KeyInfo str
a830: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75 6d  ucture.  The num
a840: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
a850: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69 73  n the KeyInfo is
a860: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
a870: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
a880: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
a890: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
a8a0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
a8b0: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  .**.** Specifica
a8c0: 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lly, this routin
a8d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  e is called to o
a8e0: 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61 62  pen an index tab
a8f0: 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49 4e  le for.** DISTIN
a900: 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45 52  CT, UNION, INTER
a910: 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20  SECT and EXCEPT 
a920: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a930: 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20 55  s (but not .** U
a940: 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  NION ALL)..**.**
a950: 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 74 61   Make the new ta
a960: 62 6c 65 20 61 20 4b 65 79 41 73 44 61 74 61 20  ble a KeyAsData 
a970: 74 61 62 6c 65 20 69 66 20 6b 65 79 41 73 44 61  table if keyAsDa
a980: 74 61 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ta is true..**.*
a990: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a9a0: 72 6e 65 64 20 69 73 20 74 68 65 20 61 64 64 72  rned is the addr
a9b0: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 70  ess of the OP_Op
a9c0: 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74 69  enTemp instructi
a9d0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
a9e0: 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28  t openTempIndex(
a9f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
aa00: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54  elect *p, int iT
aa10: 61 62 2c 20 69 6e 74 20 6b 65 79 41 73 44 61 74  ab, int keyAsDat
aa20: 61 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  a){.  KeyInfo *p
aa30: 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  KeyInfo;.  int n
aa40: 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69 74 65  Column;.  sqlite
aa50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
aa60: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  db;.  int i;.  V
aa70: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
aa80: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61 64  >pVdbe;.  int ad
aa90: 64 72 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53  dr;..  if( prepS
aaa0: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
aab0: 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
aac0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  rn 0;.  }.  nCol
aad0: 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  umn = p->pEList-
aae0: 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65 79 49 6e  >nExpr;.  pKeyIn
aaf0: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
ab00: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49  c( sizeof(*pKeyI
ab10: 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  nfo)+nColumn*siz
ab20: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 29 3b  eof(CollSeq*) );
ab30: 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 3d  .  if( pKeyInfo=
ab40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ab50: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
ab60: 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65 79   db->enc;.  pKey
ab70: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
ab80: 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72 28 69 3d  Column;.  for(i=
ab90: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
aba0: 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  +){.    pKeyInfo
abb0: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
abc0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
abd0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
abe0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
abf0: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
ac00: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
ac10: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
ac20: 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44  Coll[i] = db->pD
ac30: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  fltColl;.    }. 
ac40: 20 7d 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69   }.  addr = sqli
ac50: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ac60: 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62 2c  _OpenTemp, iTab,
ac70: 20 30 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72   0, .      (char
ac80: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
ac90: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
aca0: 0a 20 20 69 66 28 20 6b 65 79 41 73 44 61 74 61  .  if( keyAsData
acb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
acc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
acd0: 65 79 41 73 44 61 74 61 2c 20 69 54 61 62 2c 20  eyAsData, iTab, 
ace0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
acf0: 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65   addr;.}..#ifnde
ad00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ad10: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
ad20: 0a 2a 2a 20 41 64 64 20 74 68 65 20 61 64 64 72  .** Add the addr
ad30: 65 73 73 20 22 61 64 64 72 22 20 74 6f 20 74 68  ess "addr" to th
ad40: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 4f 70 65  e set of all Ope
ad50: 6e 54 65 6d 70 20 6f 70 63 6f 64 65 20 61 64 64  nTemp opcode add
ad60: 72 65 73 73 65 73 0a 2a 2a 20 74 68 61 74 20 61  resses.** that a
ad70: 72 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c  re being accumul
ad80: 61 74 65 64 20 69 6e 20 70 2d 3e 70 70 4f 70 65  ated in p->ppOpe
ad90: 6e 54 65 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nTemp..*/.static
ada0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
adb0: 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 53 65 6c  OpenTempAddr(Sel
adc0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  ect *p, int addr
add0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  ){.  IdList *pLi
ade0: 73 74 20 3d 20 2a 70 2d 3e 70 70 4f 70 65 6e 54  st = *p->ppOpenT
adf0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  emp = sqlite3IdL
ae00: 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70 70  istAppend(*p->pp
ae10: 4f 70 65 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20  OpenTemp, 0);.  
ae20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
ae30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ae40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
ae50: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
ae60: 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61 64 64 72  Id-1].idx = addr
ae70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ae80: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
ae90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
aea0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
aeb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aec0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
aed0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
aee0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
aef0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
af00: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
af10: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
af20: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
af30: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
af40: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
af50: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
af60: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
af70: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
af80: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
af90: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
afa0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
afb0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
afc0: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
afd0: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
afe0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
aff0: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
b000: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
b010: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
b020: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
b030: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
b040: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b050: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b060: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
b070: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
b080: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
b090: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
b0a0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
b0b0: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
b0c0: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
b0d0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
b0e0: 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  }.  if( pRet==0 
b0f0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
b100: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
b110: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
b120: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
b130: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
b140: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
b150: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
b160: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
b170: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b180: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b190: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
b1a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b1b0: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
b1c0: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
b1d0: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
b1e0: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
b1f0: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
b200: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
b210: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
b220: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
b230: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
b240: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
b250: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
b260: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
b270: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
b280: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
b290: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b2a0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
b2b0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
b2c0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
b2d0: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
b2e0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
b2f0: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
b300: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
b310: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
b320: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
b330: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
b340: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
b350: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
b360: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
b370: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
b380: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
b390: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
b3a0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
b3b0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
b3c0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
b3d0: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
b3e0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
b3f0: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
b400: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
b410: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
b420: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
b430: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
b440: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
b460: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b470: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
b480: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
b490: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
b4a0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
b4b0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
b4c0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
b4d0: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
b4e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b4f0: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
b500: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
b510: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
b520: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
b530: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
b540: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
b550: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
b560: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
b570: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
b580: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
b590: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
b5a0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
b5b0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
b5c0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
b5d0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
b5e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
b5f0: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
b600: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b610: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b620: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
b630: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
b640: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
b650: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
b660: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
b670: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
b680: 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74       /* \___  St
b690: 6f 72 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  ore query result
b6a0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 2a  s as specified *
b6b0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
b6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20            /* /  
b6d0: 20 20 20 62 79 20 74 68 65 73 65 20 74 77 6f 20     by these two 
b6e0: 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20  parameters.     
b6f0: 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61      */.  char *a
b700: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
b710: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
b720: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
b730: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
b740: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
b750: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
b760: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
b770: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
b780: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
b790: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
b7a0: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
b7b0: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
b7c0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b7e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
b7f0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
b800: 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 54 65 6d  IdList *pOpenTem
b810: 70 20 3d 20 30 3b 2f 2a 20 4f 50 5f 4f 70 65 6e  p = 0;/* OP_Open
b820: 54 65 6d 70 20 6f 70 63 6f 64 65 73 20 74 68 61  Temp opcodes tha
b830: 74 20 6e 65 65 64 20 61 20 4b 65 79 49 6e 66 6f  t need a KeyInfo
b840: 20 2a 2f 0a 20 20 69 6e 74 20 61 41 64 64 72 5b   */.  int aAddr[
b850: 35 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  5];         /* A
b860: 64 64 72 65 73 73 65 73 20 6f 66 20 53 65 74 4e  ddresses of SetN
b870: 75 6d 43 6f 6c 75 6d 6e 73 20 6f 70 65 72 61 74  umColumns operat
b880: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 64  ors */.  int nAd
b890: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  dr = 0;        /
b8a0: 2a 20 4e 75 6d 62 65 72 20 75 73 65 64 20 2a 2f  * Number used */
b8b0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b8d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
b8e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b8f0: 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
b900: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
b910: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
b920: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
b930: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
b940: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
b950: 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
b960: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
b970: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
b980: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
b990: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
b9a0: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
b9b0: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
b9c0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
b9d0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
b9e0: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
b9f0: 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  r;.  if( pPrior-
ba00: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
ba10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ba20: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
ba30: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
ba40: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
ba50: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
ba60: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
ba70: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
ba80: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
ba90: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
baa0: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
bab0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
bac0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bad0: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
bae0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
baf0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
bb00: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
bb10: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bb20: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
bb30: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bb40: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
bb50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
bb60: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
bb70: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
bb80: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
bb90: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
bba0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
bbb0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
bbc0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
bbd0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bbe0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bbf0: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 20 74 68 69  ..  /* If *p thi
bc00: 73 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  s is the right-m
bc10: 6f 73 74 20 73 65 6c 65 63 74 20 73 74 61 74 65  ost select state
bc20: 6d 65 6e 74 2c 20 74 68 65 6e 20 69 6e 69 74 69  ment, then initi
bc30: 61 6c 69 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70  alize.  ** p->pp
bc40: 4f 70 65 6e 54 65 6d 70 20 74 6f 20 70 6f 69 6e  OpenTemp to poin
bc50: 74 20 74 6f 20 70 4f 70 65 6e 54 65 6d 70 2e 20  t to pOpenTemp. 
bc60: 20 49 66 20 2a 70 20 69 73 20 6e 6f 74 20 74 68   If *p is not th
bc70: 65 20 72 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a  e right most.  *
bc80: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 65 6e  * statement then
bc90: 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 77   p->ppOpenTemp w
bca0: 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
bcb0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
bcc0: 64 0a 20 20 2a 2a 20 62 79 20 61 20 70 72 69 6f  d.  ** by a prio
bcd0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 73  r call to this s
bce0: 61 6d 65 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ame procedure.  
bcf0: 50 61 73 73 20 61 6c 6f 6e 67 20 74 68 65 20 70  Pass along the p
bd00: 4f 70 65 6e 54 65 6d 70 0a 20 20 2a 2a 20 70 6f  OpenTemp.  ** po
bd10: 69 6e 74 65 72 20 74 6f 20 70 50 72 69 6f 72 2c  inter to pPrior,
bd20: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
bd30: 65 6e 74 20 74 6f 20 6f 75 72 20 6c 65 66 74 2e  ent to our left.
bd40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
bd50: 70 4f 70 65 6e 54 65 6d 70 3d 3d 30 20 29 7b 0a  pOpenTemp==0 ){.
bd60: 20 20 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d      p->ppOpenTem
bd70: 70 20 3d 20 26 70 4f 70 65 6e 54 65 6d 70 3b 0a  p = &pOpenTemp;.
bd80: 20 20 7d 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70    }.  pPrior->pp
bd90: 4f 70 65 6e 54 65 6d 70 20 3d 20 70 2d 3e 70 70  OpenTemp = p->pp
bda0: 4f 70 65 6e 54 65 6d 70 3b 0a 0a 20 20 2f 2a 20  OpenTemp;..  /* 
bdb0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
bdc0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
bdd0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
bde0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ary.  */.  if( e
bdf0: 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
be00: 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ble ){.    asser
be10: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
be20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
be30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
be40: 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
be50: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 64 64      assert( nAdd
be60: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 61 41 64 64  r==0 );.    aAdd
be70: 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c  r[nAddr++] = sql
be80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
be90: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
bea0: 73 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  s, iParm, 0);.  
beb0: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
bec0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
bed0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
bee0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
bef0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
bf00: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
bf10: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
bf20: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
bf30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
bf40: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
bf50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
bf60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
bf70: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
bf80: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
bf90: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
bfa0: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
bfb0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
bfc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
bfd0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
bfe0: 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61  rior, eDest, iPa
bff0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
c000: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
c010: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
c020: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c030: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
c040: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
c050: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
c060: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
c070: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
c080: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
c090: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
c0a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
c0b0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
c0c0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
c0d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c0e0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c0f0: 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
c100: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
c110: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  );.        p->pP
c120: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
c130: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
c140: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c150: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c160: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c180: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
c190: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
c1a0: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
c1b0: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
c1c0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
c1d0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
c1e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
c1f0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
c200: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
c210: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
c220: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
c230: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
c240: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
c250: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
c260: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
c270: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
c280: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
c290: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
c2a0: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
c2b0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
c2c0: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
c2d0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
c2e0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
c2f0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
c300: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
c310: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
c320: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78  fset */.      Ex
c330: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
c340: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ;     /* The ORD
c350: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
c360: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
c370: 54 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  T */.      int a
c380: 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  ddr;..      prio
c390: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
c3a0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
c3b0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
c3c0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
c3d0: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
c3e0: 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70  erBy==0 && !p->p
c3f0: 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66  Limit && !p->pOf
c400: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
c410: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
c420: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
c430: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
c440: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
c450: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
c460: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c470: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
c480: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
c490: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
c4a0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
c4b0: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
c4c0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
c4d0: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
c4e0: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
c4f0: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
c500: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
c510: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
c520: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
c530: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c540: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63  .        && matc
c550: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
c560: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
c570: 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61  OrderBy, unionTa
c580: 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b, 1) ){.       
c590: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
c5a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c5b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
c5d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c5e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
c5f0: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
c600: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
c610: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  p->op!=TK_ALL ){
c620: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c630: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
c640: 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29  empAddr(p, addr)
c650: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c660: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
c680: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c690: 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  nd;.          }.
c6a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c6b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c6c0: 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f  _KeyAsData, unio
c6d0: 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20  nTab, 1);.      
c6e0: 20 20 7d 0a 09 61 73 73 65 72 74 28 20 6e 41 64    }..assert( nAd
c6f0: 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29  dr<sizeof(aAddr)
c700: 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d  /sizeof(aAddr[0]
c710: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 41 64  ) );.        aAd
c720: 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71  dr[nAddr++] = sq
c730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c740: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
c750: 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  ns, unionTab, 0)
c760: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c770: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c780: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c790: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
c7a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
c7b0: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
c7c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c7d0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
c7e0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
c7f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c800: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
c810: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  orOp, unionTab, 
c820: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c830: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c840: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c850: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c860: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c870: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
c880: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c890: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
c8a0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c8b0: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
c8c0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
c8d0: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
c8e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
c8f0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
c900: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
c910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c920: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
c930: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
c940: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
c950: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
c960: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c970: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
c980: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
c990: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
c9a0: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
c9b0: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
c9c0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
c9d0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
c9e0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c9f0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
ca00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ca10: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ca20: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
ca30: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
ca40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
ca50: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
ca60: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
ca70: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
ca80: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
ca90: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
caa0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
cab0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
cac0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
cad0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
cae0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
caf0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
cb00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cb10: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cb20: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cb30: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
cb40: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
cb50: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
cb60: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
cb70: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
cb80: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
cb90: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
cba0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
cbb0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
cbc0: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
cbd0: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
cbe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
cbf0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
cc00: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
cc10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cc20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
cc30: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
cc40: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
cc50: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cc60: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
cc70: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
cc80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
cc90: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
cca0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ccb0: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
ccc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ccd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
cce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ccf0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
cd00: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
cd10: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
cd20: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
cd30: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
cd40: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
cd50: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cd60: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
cd70: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
cd80: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
cd90: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
cda0: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
cdb0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
cde0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
cdf0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
ce20: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ce30: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
ce40: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
ce50: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ce60: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
ce70: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
ce80: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
ce90: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
cea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ceb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
cec0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
ced0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
cee0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cef0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
cf00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cf10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cf20: 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
cf30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
cf40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
cf60: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
cf70: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
cf80: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
cf90: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
cfa0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
cfb0: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
cfc0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
cfd0: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
cfe0: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
cff0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
d000: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
d010: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
d020: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
d030: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
d040: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
d050: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
d060: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
d070: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
d080: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
d090: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
d0a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d0b0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
d0c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
d0d0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
d0e0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
d0f0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d  lumn(pParse,p,p-
d100: 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31  >pOrderBy,tab1,1
d110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
d120: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
d130: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d140: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d150: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d170: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c  _OpenTemp, tab1,
d180: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
d190: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
d1a0: 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29  empAddr(p, addr)
d1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d1c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d1d0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d1e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d1f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d200: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d210: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31  _KeyAsData, tab1
d220: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
d230: 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66  rt( nAddr<sizeof
d240: 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61  (aAddr)/sizeof(a
d250: 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Addr[0]) );.    
d260: 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d    aAddr[nAddr++]
d270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d280: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
d290: 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30  Columns, tab1, 0
d2a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d2b0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
d2c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d2d0: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
d2e0: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
d2f0: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
d300: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d310: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
d320: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
d330: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
d340: 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab1, 0, 0, 0, af
d350: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
d360: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d370: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d380: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
d390: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
d3a0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
d3b0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d3c0: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
d3d0: 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
d3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d3f0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
d400: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
d410: 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
d420: 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20  OpenTempAddr(p, 
d430: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  addr);.      if(
d440: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d450: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d460: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d490: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
d4a0: 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20   tab2, 1);.     
d4b0: 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73   assert( nAddr<s
d4c0: 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a  izeof(aAddr)/siz
d4d0: 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b  eof(aAddr[0]) );
d4e0: 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64  .      aAddr[nAd
d4f0: 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56  dr++] = sqlite3V
d500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d510: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61  etNumColumns, ta
d520: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 0);.      p-
d530: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
d540: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
d550: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
d560: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
d570: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
d580: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
d590: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
d5a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5b0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d5c0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
d5d0: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  2, 0, 0, 0, aff)
d5e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d5f0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d600: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d610: 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  ete(p->pLimit);.
d620: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d630: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
d640: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
d650: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
d660: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d670: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d680: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d690: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
d6a0: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
d6b0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
d6c0: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
d6d0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
d6e0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
d6f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d700: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
d710: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
d720: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
d730: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
d740: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
d750: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
d760: 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
d770: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d780: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d790: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
d7a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d7b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d7c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7d0: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
d7e0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d  reak);.      com
d7f0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
d800: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
d810: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
d820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d830: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
d840: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
d850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d860: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
d870: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
d880: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d890: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d8a0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
d8b0: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
d8c0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
d8f0: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
d900: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
d930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d940: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d950: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
d960: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d980: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d990: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
d9a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d9c0: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
d9d0: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
d9e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d9f0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
da00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
da20: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
da30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
da50: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
da60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da70: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
da80: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
da90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
daa0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
dab0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
dac0: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
dad0: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
dae0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
daf0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
db00: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
db10: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
db20: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
db30: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
db40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
db50: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
db60: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
db70: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
db80: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
db90: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
dba0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
dbb0: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
dbc0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
dbd0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
dbe0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dbf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
dc00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
dc10: 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  umns in temporar
dc20: 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  y tables.  */.  
dc30: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
dc40: 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  ->nExpr;.  while
dc50: 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20 20  ( nAddr>0 ){.   
dc60: 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73 71   nAddr--;.    sq
dc70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
dc80: 32 28 76 2c 20 61 41 64 64 72 5b 6e 41 64 64 72  2(v, aAddr[nAddr
dc90: 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
dca0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
dcb0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
dcc0: 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
dcd0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
dce0: 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
dcf0: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
dd00: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
dd10: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
dd20: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
dd30: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
dd40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
dd50: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
dd60: 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
dd70: 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
dd80: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
dd90: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
dda0: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
ddb0: 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
ddc0: 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
ddd0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
dde0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
ddf0: 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
de00: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
de10: 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
de20: 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
de30: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
de40: 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
de50: 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
de60: 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
de70: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
de80: 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
de90: 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
dea0: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
deb0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20   p->pOrderBy || 
dec0: 28 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 70 4f  (pOpenTemp && pO
ded0: 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3e 30 29 20  penTemp->nId>0) 
dee0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
df10: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
df20: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
df30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
df40: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
df50: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
df60: 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
df70: 74 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  t( p->ppOpenTemp
df80: 20 3d 3d 20 26 70 4f 70 65 6e 54 65 6d 70 20 29   == &pOpenTemp )
df90: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
dfa0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
dfb0: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
dfc0: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  nCol*sizeof(Coll
dfd0: 53 65 71 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  Seq*));.    if( 
dfe0: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
dff0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e000: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e010: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e020: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
e030: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50  eyInfo->enc = pP
e040: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
e050: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
e060: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
e070: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
e080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4b  ; i++){.      pK
e090: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
e0a0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
e0b0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
e0c0: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   i);.      if( !
e0d0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
e0e0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i] ){.        pK
e0f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
e100: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
e110: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
e120: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
e130: 28 69 3d 30 3b 20 70 4f 70 65 6e 54 65 6d 70 20  (i=0; pOpenTemp 
e140: 26 26 20 69 3c 70 4f 70 65 6e 54 65 6d 70 2d 3e  && i<pOpenTemp->
e150: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nId; i++){.     
e160: 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20 28 69   int p3type = (i
e170: 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ==0?P3_KEYINFO_H
e180: 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49 4e 46  ANDOFF:P3_KEYINF
e190: 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  O);.      int ad
e1a0: 64 72 20 3d 20 70 4f 70 65 6e 54 65 6d 70 2d 3e  dr = pOpenTemp->
e1b0: 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20  a[i].idx;.      
e1c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e1d0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
e1e0: 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  ar *)pKeyInfo, p
e1f0: 33 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  3type);.    }.. 
e200: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
e210: 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
e220: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e230: 20 2a 70 4f 72 64 65 72 42 79 54 65 72 6d 20 3d   *pOrderByTerm =
e240: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
e250: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e260: 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
e270: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65  Expr; i++, pOrde
e280: 72 42 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  rByTerm++){.    
e290: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e2a0: 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e  = pOrderByTerm->
e2b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63  pExpr;.        c
e2c0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72  har *zName = pOr
e2d0: 64 65 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65  derByTerm->zName
e2e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e2f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e300: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
e310: 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b  >iColumn<nCol );
e320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65  .        /* asse
e330: 72 74 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c  rt( !pExpr->pCol
e340: 6c 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  l ); */.        
e350: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
e360: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
e370: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
e380: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
e390: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  e, zName, -1);. 
e3a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e3b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
e3c0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
e3d0: 3e 61 43 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43  >aColl[pExpr->iC
e3e0: 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20  olumn];.        
e3f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e400: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
e410: 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
e420: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
e430: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
e440: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
e450: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
e460: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
e470: 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  ns for UNION ALL
e480: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f   ... ORDER BY */
e490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
e4a0: 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  e(pKeyInfo);.   
e4b0: 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65   }.  }..multi_se
e4c0: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20  lect_end:.  if( 
e4d0: 70 4f 70 65 6e 54 65 6d 70 20 29 7b 0a 20 20 20  pOpenTemp ){.   
e4e0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
e4f0: 6c 65 74 65 28 70 4f 70 65 6e 54 65 6d 70 29 3b  lete(pOpenTemp);
e500: 0a 20 20 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e  .  }.  p->ppOpen
e510: 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  Temp = 0;.  retu
e520: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e530: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e540: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e550: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e560: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
e570: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
e580: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
e590: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
e5a0: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
e5b0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
e5c0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
e5d0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
e5e0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
e5f0: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
e600: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
e610: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
e620: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
e630: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
e640: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e650: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
e660: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
e670: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
e680: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
e690: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
e6a0: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
e6b0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
e6c0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
e6d0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
e6e0: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
e6f0: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
e700: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
e710: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
e720: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
e730: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
e740: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
e750: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
e760: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
e770: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
e780: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
e790: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
e7a0: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
e7b0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e7c0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
e7d0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e7e0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
e7f0: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
e800: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
e810: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
e820: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
e830: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
e840: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
e850: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e860: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e870: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
e880: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
e890: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
e8a0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
e8b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e8c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e8d0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
e8e0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e8f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
e900: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
e910: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
e920: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
e930: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
e940: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
e950: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
e960: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
e970: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
e980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e990: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
e9a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
e9b0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
e9c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
e9d0: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
e9e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
e9f0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
ea00: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
ea10: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ea20: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
ea30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
ea40: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
ea50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
ea60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
ea70: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
ea80: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ea90: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
eaa0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
eab0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
eac0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
ead0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eae0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
eaf0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
eb00: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
eb10: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
eb20: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
eb30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
eb40: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
eb50: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
eb60: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
eb70: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
eb80: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
eb90: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
eba0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ebb0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
ebc0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
ebd0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
ebe0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
ebf0: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
ec00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
ec10: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
ec20: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
ec30: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
ec40: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
ec50: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
ec60: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
ec70: 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65  elect(pExpr->pSe
ec80: 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
ec90: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
eca0: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
ecb0: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
ecc0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
ecd0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
ece0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
ecf0: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
ed00: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
ed10: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
ed20: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ed30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ed40: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
ed50: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
ed60: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
ed70: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
ed80: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
ed90: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
eda0: 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63  ubstSelect(Selec
edb0: 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  t *p, int iTable
edc0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
edd0: 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  st){.  if( !p ) 
ede0: 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
edf0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
ee00: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
ee10: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
ee20: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
ee30: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ee40: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
ee50: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
ee60: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ee70: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
ee80: 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
ee90: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
eea0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
eeb0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
eec0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
eed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
eee0: 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e  T_VIEW) */..#ifn
eef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ef00: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  VIEW./*.** This 
ef10: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
ef20: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
ef30: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
ef40: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
ef50: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
ef60: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
ef70: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
ef80: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
ef90: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
efa0: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
efb0: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
efc0: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
efd0: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
efe0: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
eff0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
f000: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
f010: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
f020: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
f030: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
f040: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
f050: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
f060: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
f070: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
f080: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
f090: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
f0a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
f0b0: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
f0c0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f0d0: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
f0e0: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
f0f0: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
f100: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
f110: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
f120: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
f130: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
f140: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
f150: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
f160: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
f170: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
f180: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
f190: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f1a0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
f1b0: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
f1c0: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
f1d0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
f1e0: 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
f1f0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
f200: 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
f210: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
f220: 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
f230: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
f240: 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
f250: 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
f260: 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
f270: 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
f280: 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
f290: 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
f2a0: 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
f2b0: 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
f2c0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
f2d0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
f2e0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
f2f0: 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
f300: 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
f310: 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
f320: 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
f330: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
f340: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
f350: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
f360: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
f370: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
f380: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
f390: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
f3a0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
f3b0: 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
f3c0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f3d0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
f3e0: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
f3f0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
f400: 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
f410: 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
f420: 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
f430: 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
f440: 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
f450: 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
f460: 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
f470: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
f480: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
f490: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
f4a0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
f4b0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
f4c0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
f4d0: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
f4e0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f4f0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
f500: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
f510: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
f520: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f530: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
f540: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
f550: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
f560: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
f570: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
f580: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
f590: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
f5a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
f5b0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f5c0: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
f5d0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f5e0: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
f5f0: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
f600: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
f610: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
f620: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f630: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
f640: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
f650: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
f660: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f670: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
f680: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
f690: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
f6a0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
f6b0: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
f6c0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
f6d0: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
f6e0: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
f6f0: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
f700: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
f710: 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
f720: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
f730: 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
f740: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
f750: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
f760: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
f770: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
f780: 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
f790: 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  50).**.** In thi
f7a0: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
f7b0: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
f7c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
f7d0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
f7e0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f7f0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
f800: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
f810: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
f820: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
f830: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
f840: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
f850: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
f860: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
f870: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
f880: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
f890: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
f8a0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f8b0: 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
f8c0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
f8d0: 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
f8e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f8f0: 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
f900: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f910: 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
f920: 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
f930: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
f940: 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
f950: 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
f960: 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
f970: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
f980: 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
f990: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f9a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
f9b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
f9c0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
f9d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
f9e0: 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
f9f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
fa00: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
fa10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
fa20: 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
fa30: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
fa40: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
fa50: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
fa60: 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
fa70: 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
fa80: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
fa90: 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
faa0: 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
fab0: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
fac0: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
fad0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
fae0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
faf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
fb00: 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
fb10: 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
fb20: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
fb30: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
fb40: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
fb50: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
fb60: 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
fb70: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
fb80: 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
fb90: 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
fba0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
fbb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
fbc0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fbd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
fbe0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
fbf0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
fc00: 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
fc10: 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
fc20: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
fc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fc40: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fc50: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
fc80: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
fc90: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
fca0: 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
fcb0: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20  e subquery */.. 
fcc0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
fcd0: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
fce0: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
fcf0: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
fd00: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
fd10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
fd20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
fd30: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
fd40: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
fd50: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
fd60: 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
fd70: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70  c->a[iFrom];.  p
fd80: 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
fd90: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
fda0: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
fdb0: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
fdc0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
fdd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
fde0: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
fdf0: 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
fe00: 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63  urn 0;.  pSubSrc
fe10: 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
fe20: 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
fe30: 20 29 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d   );.  if( (pSub-
fe40: 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
fe50: 69 6d 69 74 29 20 7c 7c 20 70 53 75 62 2d 3e 70  imit) || pSub->p
fe60: 4f 66 66 73 65 74 20 7c 7c 20 0a 20 20 20 20 20  Offset || .     
fe70: 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26   (pSub->pLimit &
fe80: 26 20 69 73 41 67 67 29 20 29 20 72 65 74 75 72  & isAgg) ) retur
fe90: 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 53  n 0;.  if( pSubS
fea0: 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
feb0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
fec0: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26  ub->isDistinct &
fed0: 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
fee0: 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
fef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ff00: 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
ff10: 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49  nct && subqueryI
ff20: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
ff30: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
ff40: 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
ff50: 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
ff60: 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
ff70: 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
ff80: 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
ff90: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
ffa0: 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
ffb0: 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
ffc0: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
ffd0: 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
ffe0: 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
fff0: 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
10000 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
10010 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
10020 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
10030 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
10040 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
10050 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
10060 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
10070 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
10080 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
10090 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
100a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
100b0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
100c0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
100d0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
100e0 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72  c->nSrc>1 && iFr
100f0 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
10100 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
10110 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
10120 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10130 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
10140 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
10150 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10160 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
10170 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
10180 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
10190 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
101a0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
101b0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
101c0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
101d0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
101e0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
101f0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
10200 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
10210 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
10220 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
10230 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
10240 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
10250 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
10260 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
10270 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
10280 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
10290 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
102a0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
102b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
102c0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
102d0 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
102e0 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
102f0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
10300 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
10310 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
10320 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
10330 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
10340 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
10350 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
10360 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
10370 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
10380 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
10390 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
103a0 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
103b0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
103c0 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
103d0 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
103e0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
103f0 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
10400 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
10410 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
10420 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
10430 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
10440 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
10450 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
10460 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
10470 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
10480 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
10490 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
104a0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
104b0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
104c0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
104d0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
104e0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
104f0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
10500 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
10510 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
10520 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
10530 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
10540 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
10550 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
10560 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
10570 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
10580 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
10590 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
105a0 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
105b0 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
105c0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
105d0 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
105e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
105f0 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
10600 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
10610 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
10620 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
10630 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
10640 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
10650 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  b = pSubitem->pT
10660 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61  ab;..    if( pTa
10670 62 20 26 26 20 70 54 61 62 2d 3e 69 73 54 72 61  b && pTab->isTra
10680 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
10690 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
106a0 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e  le(0, pSubitem->
106b0 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
106c0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
106d0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
106e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
106f0 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
10700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
10710 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
10720 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  as);.    if( nSu
10730 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
10740 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62  int extra = nSub
10750 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66  Src - 1;.      f
10760 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72  or(i=1; i<nSubSr
10770 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
10780 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
10790 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72  rcListAppend(pSr
107a0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
107b0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
107c0 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
107d0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
107e0 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
107f0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
10800 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
10810 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
10820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
10840 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
10850 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
10860 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
10870 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
10880 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
10890 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
108a0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
108b0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
108c0 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f  om+nSubSrc-1].jo
108d0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
108e0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
108f0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
10900 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
10910 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
10920 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
10930 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
10940 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
10950 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
10960 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
10970 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
10980 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
10990 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
109a0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
109b0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
109c0 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
109e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
109f0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
10a00 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
10a10 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
10a20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
10a30 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
10a40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10a50 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
10a60 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
10a70 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
10a80 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
10a90 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
10aa0 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
10ab0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
10ac0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
10ad0 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
10ae0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
10af0 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75  y+10"..  */.  su
10b00 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
10b10 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
10b20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10b30 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69   pList = p->pELi
10b40 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
10b50 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
10b60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10b70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Expr;.    if( pL
10b80 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
10b90 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70  =0 && (pExpr = p
10ba0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10bb0 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a  )->span.z!=0 ){.
10bc0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
10bd0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
10be0 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73  StrNDup(pExpr->s
10bf0 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
10c00 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  an.n);.    }.  }
10c10 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
10c20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
10c30 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
10c40 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10c50 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
10c60 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
10c70 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10c80 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
10c90 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
10ca0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
10cb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
10cc0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
10cd0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
10ce0 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  rBy;.    pSub->p
10cf0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
10d00 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64  else if( p->pOrd
10d10 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73  erBy ){.    subs
10d20 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
10d30 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
10d40 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10d50 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
10d60 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
10d70 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
10d80 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72  rDup(pSub->pWher
10d90 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
10da0 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
10db0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
10dc0 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
10dd0 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
10de0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
10df0 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
10e00 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
10e10 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
10e20 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
10e30 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
10e40 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
10e50 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
10e60 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48  te3ExprAnd(p->pH
10e70 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78  aving, sqlite3Ex
10e80 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76  prDup(pSub->pHav
10e90 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ing));.    asser
10ea0 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
10eb0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  0 );.    p->pGro
10ec0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
10ed0 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e  prListDup(pSub->
10ee0 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c  pGroupBy);.  }el
10ef0 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
10f00 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  r(p->pWhere, iPa
10f10 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10f20 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  st);.    p->pWhe
10f30 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
10f40 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  And(p->pWhere, p
10f50 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Where);.  }..  /
10f60 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
10f70 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
10f80 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
10f90 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a  inner or the.  *
10fa0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
10fb0 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f   distinct. .  */
10fc0 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  .  p->isDistinct
10fd0 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
10fe0 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74   || pSub->isDist
10ff0 69 6e 63 74 3b 0a 0a 20 20 69 66 28 20 70 53 75  inct;..  if( pSu
11000 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
11010 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75   p->pLimit = pSu
11020 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70  b->pLimit;.    p
11030 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
11040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
11050 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
11060 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
11070 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
11080 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
11090 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
110a0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
110b0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
110c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
110d0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
110e0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
110f0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11100 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
11110 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
11120 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
11130 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
11140 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
11150 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
11160 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
11170 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
11180 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
11190 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
111a0 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
111b0 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
111c0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
111d0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
111e0 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
111f0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
11200 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
11210 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
11220 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
11230 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
11240 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
11250 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
11260 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
11270 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
11280 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
11290 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
112a0 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
112b0 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
112c0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
112d0 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
112e0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
112f0 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
11300 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
11310 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
11320 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
11330 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
11340 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11350 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
11360 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
11370 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
11380 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
11390 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
113a0 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
113b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
113c0 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
113d0 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
113e0 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
113f0 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
11400 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
11410 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
11420 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
11430 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11450 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
11460 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11470 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
11480 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
11490 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
114a0 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
114b0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
114c0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
114d0 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
114e0 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
114f0 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
11500 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
11510 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
11520 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11530 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
11540 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
11550 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
11560 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
11570 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
11580 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
11590 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
115a0 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
115b0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
115c0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
115d0 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
115e0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
115f0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
11600 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
11610 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
11620 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
11630 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
11640 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
11650 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
11660 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
11670 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
11680 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
11690 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
116a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
116b0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
116c0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
116d0 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
116e0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
116f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
11700 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
11710 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
11720 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  3StrNICmp(pExpr-
11730 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33  >token.z,"min",3
11740 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
11750 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a  Op = OP_Rewind;.
11760 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
11770 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
11780 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
11790 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
117a0 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
117b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
117c0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
117d0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  pr = pList->a[0]
117e0 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
117f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
11800 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
11810 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
11820 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
11830 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
11840 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
11850 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
11860 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
11870 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
11880 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
11890 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
118a0 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
118b0 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
118c0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
118d0 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
118e0 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
118f0 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
11900 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11910 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
11920 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
11930 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
11940 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
11950 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
11960 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
11970 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
11980 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
11990 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
119a0 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53  }else{.    CollS
119b0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
119c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
119d0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
119e0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
119f0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11a00 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11a10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11a20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
11a30 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
11a40 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
11a50 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e  ==iCol && pIdx->
11a60 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
11a70 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ==pColl ) break;
11a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11a90 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
11aa0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
11ab0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
11ac0 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
11ad0 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
11ae0 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
11af0 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
11b00 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
11b10 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
11b20 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
11b30 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c  ll..  ** The col
11b40 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61  umn names have a
11b50 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
11b60 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c  rated in the cal
11b70 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ling function.. 
11b80 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11b90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11ba0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11bb0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
11bc0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
11bd0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
11be0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
11bf0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
11c00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
11c10 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
11c20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
11c40 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
11c50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11c60 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
11c70 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
11c80 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
11c90 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
11ca0 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
11cb0 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
11cc0 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
11cd0 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11ce0 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
11cf0 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
11d00 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
11d10 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
11d20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
11d30 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
11d40 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11d50 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
11d60 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
11d70 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
11d80 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
11d90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
11da0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11db0 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
11dc0 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
11dd0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
11de0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11df0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11e00 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
11e10 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
11e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  {.    sqlite3Ope
11e30 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67  nTableForReading
11e40 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b  (v, base, pTab);
11e50 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71  .  }.  cont = sq
11e60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11e70 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64  el(v);.  if( pId
11e80 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
11e90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11ea0 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
11eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
11ec0 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
11ed0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
11ee0 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
11ef0 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
11f00 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
11f10 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
11f20 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
11f30 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
11f40 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
11f50 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
11f60 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
11f70 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
11f80 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
11f90 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
11fa0 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
11fb0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
11fc0 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
11fd0 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
11fe0 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
11ff0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
12000 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
12010 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12030 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
12040 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
12050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12060 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
12070 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
12080 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
12090 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
120a0 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
120b0 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
120c0 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
120d0 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
120e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120f0 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12100 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12110 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12120 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
12130 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65  1, 0);.      see
12140 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b  kOp = OP_MoveGt;
12150 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12160 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
12170 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b  eekOp, iIdx, 0);
12180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12190 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
121a0 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ecno, iIdx, 0);.
121b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
121c0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
121d0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
121e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
121f0 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
12200 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
12210 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
12220 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
12230 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
12240 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
12250 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
12260 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
12270 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
12280 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
12290 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
122a0 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
122b0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
122c0 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  cont, cont, 0);.
122d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
122e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
122f0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
12300 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
12310 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
12320 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
12330 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
12340 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
12350 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
12360 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
12370 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
12380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
12390 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
123a0 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
123b0 47 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69  GROUP BY is a li
123c0 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
123d0 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  s.  If any expre
123e0 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69  ssion.** is an i
123f0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c  nteger constant,
12400 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65   then that expre
12410 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
12420 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72  d by the.** corr
12430 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20  esponding entry 
12440 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
12450 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12460 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
12470 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
12480 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
12490 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   Name context of
124a0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
124b0 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72  ement. */.  Expr
124c0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
124d0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
124e0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
124f0 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
12500 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
12510 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
12520 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52  /* Either "ORDER
12530 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73  " or "GROUP", as
12540 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
12550 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
12560 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
12570 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20   pNC->pEList;   
12580 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
12590 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
125a0 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  T */.  Parse *pP
125b0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
125c0 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  se;     /* The r
125d0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
125e0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73   SELECT */.  ass
125f0 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a  ert( pEList );..
12600 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
12610 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12620 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12630 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12640 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  {.    int iCol;.
12650 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
12660 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
12670 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
12680 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12690 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
126a0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
126b0 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
126c0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
126d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
126e0 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
126f0 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
12700 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
12710 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
12720 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
12730 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
12740 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12750 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12760 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
12770 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  "%s BY column nu
12780 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
12790 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
127a0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
127b0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
127c0 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70  , zType, iCol, p
127d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
127e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
127f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12800 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12810 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(p
12820 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  NC, pE) ){.     
12830 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
12840 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12850 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
12860 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
12870 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12880 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  se,.          "%
12890 73 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  s BY terms must 
128a0 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
128b0 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a  er constants", z
128c0 54 79 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Type);.      ret
128d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
128e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
128f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12900 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20  ne resolves any 
12910 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68  names used in th
12920 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
12930 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  the.** supplied 
12940 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12950 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  . If the SELECT 
12960 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
12970 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61  resolved.** is a
12980 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65   sub-select, the
12990 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20  n pOuterNC is a 
129a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e  pointer to the N
129b0 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f  ameContext .** o
129c0 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c  f the parent SEL
129d0 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ECT..*/.int sqli
129e0 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
129f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12a00 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
12a10 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
12a20 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a40 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
12a50 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
12a60 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
12a70 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
12a80 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20   The outer name 
12a90 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20  context. May be 
12aa0 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78  NULL. */.){.  Ex
12ab0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
12ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12ad0 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74  lt set. */.  int
12ae0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12af0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c          /* For-l
12b00 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65  oop variable use
12b10 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  d in multiple pl
12b20 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  aces */.  NameCo
12b30 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
12b40 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61       /* Local na
12b50 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20  me-context */.. 
12b60 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
12b70 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
12b80 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
12b90 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
12ba0 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
12bb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
12bc0 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
12bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12be0 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
12bf0 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
12c00 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
12c10 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
12c20 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
12c30 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
12c40 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
12c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12c60 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
12c70 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
12c80 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
12c90 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
12ca0 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
12cb0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
12cc0 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
12cd0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
12ce0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12cf0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
12d00 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
12d10 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
12d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12d30 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
12d40 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
12d50 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
12d60 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
12d70 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
12d80 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f   ** are not allo
12d90 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  wed to refer to 
12da0 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61  any names, so pa
12db0 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65  ss an empty Name
12dc0 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  Context..  */.  
12dd0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
12de0 72 73 65 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67  rse;.  sNC.hasAg
12df0 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72  g = 0;.  sNC.nEr
12e00 72 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65  r = 0;.  sNC.nRe
12e10 66 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c  f = 0;.  sNC.pEL
12e20 69 73 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61  ist = 0;.  sNC.a
12e30 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 73  llowAgg = 0;.  s
12e40 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 30 3b  NC.pSrcList = 0;
12e50 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30  .  sNC.pNext = 0
12e60 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
12e70 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
12e80 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
12e90 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
12ea0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
12eb0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
12ec0 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
12ed0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12ee0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
12ef0 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
12f00 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
12f10 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
12f20 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
12f30 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
12f40 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
12f50 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
12f60 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
12f70 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
12f80 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
12f90 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65  erNC;..  /* Name
12fa0 43 6f 6e 74 65 78 74 2e 6e 44 65 70 74 68 20 73  Context.nDepth s
12fb0 74 6f 72 65 73 20 74 68 65 20 64 65 70 74 68 20  tores the depth 
12fc0 6f 66 20 72 65 63 75 72 73 69 6f 6e 20 66 6f 72  of recursion for
12fd0 20 74 68 69 73 20 71 75 65 72 79 2e 20 46 6f 72   this query. For
12fe0 0a 20 20 2a 2a 20 61 6e 20 6f 75 74 65 72 20 71  .  ** an outer q
12ff0 75 65 72 79 20 28 65 2e 67 2e 20 53 45 4c 45 43  uery (e.g. SELEC
13000 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
13010 6d 61 73 74 65 72 29 20 74 68 69 73 20 69 73 20  master) this is 
13020 31 2e 20 46 6f 72 0a 20 20 2a 2a 20 61 20 73 75  1. For.  ** a su
13030 62 71 75 65 72 79 20 69 74 20 69 73 20 32 2e 20  bquery it is 2. 
13040 46 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 6f  For a subquery o
13050 66 20 61 20 73 75 62 71 75 65 72 79 2c 20 33 2e  f a subquery, 3.
13060 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a   And so on. .  *
13070 2a 20 50 61 72 73 65 2e 6e 4d 61 78 44 65 70 74  * Parse.nMaxDept
13080 68 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  h is the maximum
13090 20 64 65 70 74 68 20 66 6f 72 20 61 6e 79 20 73   depth for any s
130a0 75 62 71 75 65 72 79 20 72 65 73 6f 6c 76 65 64  ubquery resolved
130b0 20 73 6f 0a 20 20 2a 2a 20 66 61 72 2e 20 54 68   so.  ** far. Th
130c0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  is is used to de
130d0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
130e0 65 72 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  er of aggregate 
130f0 63 6f 6e 74 65 78 74 73 0a 20 20 2a 2a 20 72 65  contexts.  ** re
13100 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
13110 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44  e..  */.  sNC.nD
13120 65 70 74 68 20 3d 20 28 70 4f 75 74 65 72 4e 43  epth = (pOuterNC
13130 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e 44 65 70 74  ?pOuterNC->nDept
13140 68 2b 31 3a 31 29 3b 0a 20 20 69 66 28 20 73 4e  h+1:1);.  if( sN
13150 43 2e 6e 44 65 70 74 68 3e 70 50 61 72 73 65 2d  C.nDepth>pParse-
13160 3e 6e 4d 61 78 44 65 70 74 68 20 29 7b 0a 20 20  >nMaxDepth ){.  
13170 20 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65    pParse->nMaxDe
13180 70 74 68 20 3d 20 73 4e 43 2e 6e 44 65 70 74 68  pth = sNC.nDepth
13190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
131a0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
131b0 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
131c0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
131d0 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
131e0 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
131f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
13200 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13210 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13220 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
13230 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
13240 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
13250 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
13260 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
13270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13280 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13290 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
132a0 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
132b0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
132c0 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
132d0 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
132e0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
132f0 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
13300 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
13310 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
13320 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
13330 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
13340 67 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  gg );.  if( p->p
13350 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
13360 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
13370 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
13380 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
13390 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
133a0 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
133b0 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
133c0 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
133d0 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
133e0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
133f0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
13400 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  & !p->pGroupBy )
13410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13420 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
13430 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
13440 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
13450 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
13460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13470 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
13480 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
13490 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
134a0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
134b0 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
134c0 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
134d0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
134e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
134f0 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
13500 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
13510 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
13520 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
13530 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
13540 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
13550 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
13560 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
13570 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
13580 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
13590 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
135a0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
135b0 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
135c0 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
135d0 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
135e0 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
135f0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
13600 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
13610 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
13620 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
13630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
13640 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
13650 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c 0a   p->pHaving) ||.
13660 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64        processOrd
13670 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20  erGroupBy(&sNC, 
13680 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
13690 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 70  DER") ||.      p
136a0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
136b0 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 47 72 6f  By(&sNC, p->pGro
136c0 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20  upBy, "GROUP"). 
136d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
136e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
136f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
13700 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
13710 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13720 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
13730 63 74 20 69 73 20 75 73 65 64 20 62 79 20 73 71  ct is used by sq
13740 6c 69 74 65 33 53 65 6c 65 63 74 28 29 0a 2a 2a  lite3Select().**
13750 20 74 6f 20 73 61 76 65 20 61 67 67 72 65 67 61   to save aggrega
13760 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72  te related infor
13770 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
13780 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  Parse object.** 
13790 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
137a0 65 61 63 68 20 63 61 6c 6c 20 61 6e 64 20 74 6f  each call and to
137b0 20 72 65 73 74 6f 72 65 20 69 74 20 61 74 20 74   restore it at t
137c0 68 65 20 65 6e 64 2e 20 53 65 65 0a 2a 2a 20 73  he end. See.** s
137d0 61 76 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  aveAggregateInfo
137e0 28 29 20 61 6e 64 20 72 65 73 74 6f 72 65 41 67  () and restoreAg
137f0 67 72 65 67 61 74 65 49 6e 66 6f 28 29 2e 0a 2a  gregateInfo()..*
13800 2f 20 0a 73 74 72 75 63 74 20 41 67 67 72 65 67  / .struct Aggreg
13810 61 74 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20 75  ateInfo {.  u8 u
13820 73 65 41 67 67 3b 0a 20 20 69 6e 74 20 6e 41 67  seAgg;.  int nAg
13830 67 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41  g;.  AggExpr *aA
13840 67 67 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  gg;.};.typedef s
13850 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49  truct AggregateI
13860 6e 66 6f 20 41 67 67 72 65 67 61 74 65 49 6e 66  nfo AggregateInf
13870 6f 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f 70 79 20  o;../* .** Copy 
13880 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65  aggregate relate
13890 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
138a0 6f 6d 20 74 68 65 20 50 61 72 73 65 20 73 74 72  om the Parse str
138b0 75 63 74 75 72 65 0a 2a 2a 20 69 6e 74 6f 20 74  ucture.** into t
138c0 68 65 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f  he AggregateInfo
138d0 20 73 74 72 75 63 74 75 72 65 2e 20 5a 65 72 6f   structure. Zero
138e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 72   the aggregate r
138f0 65 6c 61 74 65 64 0a 2a 2a 20 76 61 6c 75 65 73  elated.** values
13900 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
13910 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ruct..*/.static 
13920 76 6f 69 64 20 73 61 76 65 41 67 67 72 65 67 61  void saveAggrega
13930 74 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  teInfo(Parse *pP
13940 61 72 73 65 2c 20 41 67 67 72 65 67 61 74 65 49  arse, AggregateI
13950 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 70  nfo *pInfo){.  p
13960 49 6e 66 6f 2d 3e 61 41 67 67 20 3d 20 70 50 61  Info->aAgg = pPa
13970 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 70 49 6e  rse->aAgg;.  pIn
13980 66 6f 2d 3e 6e 41 67 67 20 3d 20 70 50 61 72 73  fo->nAgg = pPars
13990 65 2d 3e 6e 41 67 67 3b 0a 20 20 70 49 6e 66 6f  e->nAgg;.  pInfo
139a0 2d 3e 75 73 65 41 67 67 20 3d 20 70 50 61 72 73  ->useAgg = pPars
139b0 65 2d 3e 75 73 65 41 67 67 3b 0a 20 20 70 50 61  e->useAgg;.  pPa
139c0 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20  rse->aAgg = 0;. 
139d0 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20   pParse->nAgg = 
139e0 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65  0;.  pParse->use
139f0 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Agg = 0;.}../*.*
13a00 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65  * Copy aggregate
13a10 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61   related informa
13a20 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41 67  tion from the Ag
13a30 67 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72 75  gregateInfo stru
13a40 63 74 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20  ct.** back into 
13a50 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
13a60 75 72 65 2e 20 54 68 65 20 61 67 67 72 65 67 61  ure. The aggrega
13a70 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72  te related infor
13a80 6d 61 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65 6e  mation.** curren
13a90 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  tly stored in th
13aa0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
13ab0 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
13ac0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
13ad0 74 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e 66  toreAggregateInf
13ae0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
13af0 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20 2a   AggregateInfo *
13b00 70 49 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74 65  pInfo){.  sqlite
13b10 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67  Free(pParse->aAg
13b20 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41  g);.  pParse->aA
13b30 67 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67 67  gg = pInfo->aAgg
13b40 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  ;.  pParse->nAgg
13b50 20 3d 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b 0a   = pInfo->nAgg;.
13b60 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
13b70 20 3d 20 70 49 6e 66 6f 2d 3e 75 73 65 41 67 67   = pInfo->useAgg
13b80 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;.}.  ./*.** Gen
13b90 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
13ba0 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
13bb0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
13bc0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
13bd0 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
13be0 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
13bf0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
13c00 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
13c10 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
13c20 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
13c30 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
13c40 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13c50 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c80 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
13c90 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
13ca0 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
13cb0 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
13cc0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
13cd0 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
13ce0 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
13cf0 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
13d00 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
13d10 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
13d20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
13d30 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
13d40 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
13d50 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
13d60 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
13d70 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
13d80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13d90 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
13da0 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
13db0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
13dc0 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
13dd0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
13de0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
13df0 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
13e00 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
13e10 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
13e20 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
13e30 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
13e40 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
13e50 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
13e60 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
13e70 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
13e80 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
13e90 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
13ea0 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
13eb0 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
13ec0 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
13ed0 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
13ee0 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
13ef0 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
13f00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13f10 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
13f20 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
13f30 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
13f40 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
13f50 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
13f60 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
13f70 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
13f80 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
13f90 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
13fa0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
13fb0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
13fc0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
13fd0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
13fe0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
13ff0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
14000 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
14010 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
14020 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
14030 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
14040 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
14050 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
14060 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
14070 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
14080 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
14090 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
140a0 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
140b0 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
140c0 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
140d0 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
140e0 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
140f0 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
14100 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
14110 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
14120 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
14130 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
14140 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
14150 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
14160 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
14170 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
14180 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
14190 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
141a0 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
141b0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
141c0 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
141d0 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
141e0 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
141f0 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
14220 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
14230 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
14280 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14290 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
142a0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
142b0 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
142c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
142d0 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
142e0 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
142f0 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
14300 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
14310 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
14320 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
14330 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
14340 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
14350 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
14360 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
14370 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
14380 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
14390 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
143a0 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
143b0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
143c0 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
143d0 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
143e0 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
143f0 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
14400 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
14410 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
14420 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
14430 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
14440 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
14450 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
14460 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
14470 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14480 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
14490 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
144a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
144b0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
144c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
144d0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
144e0 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
144f0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
14500 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
14510 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
14520 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
14530 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
14540 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
14550 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
14560 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
14570 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
14580 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
14590 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
145a0 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
145b0 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
145c0 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
145d0 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
145e0 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
145f0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
14600 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
14610 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
14620 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
14630 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
14640 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
14650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
14660 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
14670 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
14680 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
14690 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
146a0 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
146b0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
146c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
146d0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
146e0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
146f0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
14700 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
14710 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
14720 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
14730 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
14740 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
14750 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
14760 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
14770 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
14780 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
14790 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
147a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
147b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
147c0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
147d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
147e0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
147f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
14800 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
14810 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14820 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
14830 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
14840 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
14850 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
14860 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
14870 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
14880 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
14890 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
148a0 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
148b0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
148c0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
148d0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
148e0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
148f0 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
14900 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
14910 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
14920 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
14930 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67  unction */.  Agg
14940 72 65 67 61 74 65 49 6e 66 6f 20 73 41 67 67 49  regateInfo sAggI
14950 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  nfo;..  if( sqli
14960 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14970 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
14980 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75  r || p==0 ) retu
14990 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
149a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
149b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
149c0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
149d0 65 74 75 72 6e 20 31 3b 0a 0a 23 69 66 6e 64 65  eturn 1;..#ifnde
149e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
149f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
14a00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
14a10 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
14a20 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
14a30 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
14a40 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
14a50 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
14a60 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
14a70 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
14a80 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66  Dest, iParm, aff
14a90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
14aa0 20 73 61 76 65 41 67 67 72 65 67 61 74 65 49 6e   saveAggregateIn
14ab0 66 6f 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  fo(pParse, &sAgg
14ac0 49 6e 66 6f 29 3b 0a 20 20 70 4f 72 64 65 72 42  Info);.  pOrderB
14ad0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14ae0 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
14af0 54 5f 55 6e 69 6f 6e 20 7c 7c 20 65 44 65 73 74  T_Union || eDest
14b00 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
14b10 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
14b20 72 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  rd ){.    p->pOr
14b30 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
14b40 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
14b50 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
14b60 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
14b70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14b80 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
14b90 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
14ba0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
14bb0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
14bc0 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
14bd0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
14be0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
14bf0 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
14c00 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
14c10 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
14c20 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
14c30 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41  ->pHaving;.  isA
14c40 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
14c50 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
14c60 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
14c70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
14c80 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
14c90 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
14ca0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
14cb0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
14cc0 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
14cd0 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
14ce0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
14cf0 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
14d00 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
14d10 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
14d20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14d30 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
14d40 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
14d50 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
14d60 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
14d70 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
14d80 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
14d90 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
14da0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65    */.  assert( e
14db0 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
14dc0 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
14dd0 72 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20  r==1 );.#ifndef 
14de0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14df0 55 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73  UERY.  if( (eDes
14e00 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
14e10 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26  est==SRT_Set) &&
14e20 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31   pEList->nExpr>1
14e30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14e40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14e50 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
14e60 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
14e70 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
14e80 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
14e90 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
14ea0 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  on");.    goto s
14eb0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
14ec0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45  endif..  /* ORDE
14ed0 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
14ee0 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
14ef0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  tions..  */.  sw
14f00 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
14f10 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
14f20 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  n:.    case SRT_
14f30 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65  Except:.    case
14f40 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20   SRT_Discard:.  
14f50 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
14f60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14f70 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
14f80 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14f90 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
14fa0 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
14fb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14fc0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14fd0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
14fe0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
14ff0 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
15000 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
15010 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
15020 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
15030 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
15040 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
15050 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
15060 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
15070 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
15080 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
15090 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
150a0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
150b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
150c0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
150d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
150e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
150f0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
15100 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
15110 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
15120 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
15130 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
15140 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15150 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
15160 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
15170 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
15180 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
15190 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  uthContext = 0;.
151a0 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
151b0 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20  oreContext;..   
151c0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
151d0 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
151e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
151f0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
15200 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ].zName!=0 ){.  
15210 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
15220 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
15230 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
15240 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
15250 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c  hContext = pTabL
15260 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
15270 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
15280 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
15290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152a0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
152b0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
152c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
152d0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
152e0 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
152f0 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a  SRT_TempTable, .
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
15320 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
15330 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
15340 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
15350 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
15360 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15370 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
15380 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
15390 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
153a0 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
153b0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
153c0 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52     if( eDest!=SR
153d0 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74  T_Union && eDest
153e0 21 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20  !=SRT_Except && 
153f0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61  eDest!=SRT_Disca
15400 72 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  rd ){.      pOrd
15410 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
15420 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
15430 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
15440 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
15450 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
15460 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
15470 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
15480 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15490 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73   Check for the s
154a0 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
154b0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
154c0 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65  function by itse
154d0 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  lf.  ** in the r
154e0 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  esult set..  */.
154f0 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d    if( simpleMinM
15500 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  axQuery(pParse, 
15510 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  p, eDest, iParm)
15520 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
15530 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15540 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
15550 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
15560 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
15570 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
15580 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
15590 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
155a0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
155b0 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
155c0 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
155d0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
155e0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
155f0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
15600 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
15610 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
15620 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
15630 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e  y(pParse, pParen
15640 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70  t, parentTab, *p
15650 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67  ParentAgg, isAgg
15660 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41  ) ){.    if( isA
15670 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67  gg ) *pParentAgg
15680 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 1;.    goto s
15690 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
156a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
156b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
156c0 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f   BY clause, reso
156d0 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  lve any collatio
156e0 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a  n sequences.  **
156f0 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76 65   names that have
15700 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79   been explicitly
15710 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
15720 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
15730 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15740 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
15750 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
15760 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
15770 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
15780 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
15790 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d  ].pExpr->pColl =
157a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
157b0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
157c0 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  eq(pParse, pOrde
157d0 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  rBy->a[i].zName,
157e0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
157f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
15800 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
15810 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
15820 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
15830 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
15840 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75  er..  */.  compu
15850 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
15860 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20  (pParse, p);..  
15870 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
15880 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
15890 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
158a0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
158b0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
158c0 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
158d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
158e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
158f0 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
15900 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
15910 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15920 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
15930 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
15940 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
15950 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
15960 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
15970 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
15980 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20  .  if( isAgg || 
15990 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
159a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
159b0 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nAgg==0 );.    i
159c0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  sAgg = 1;.    fo
159d0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
159e0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
159f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15a00 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
15a10 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c  ates(pParse, pEL
15a20 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15a40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15a50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15a60 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
15a70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15a80 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
15a90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15aa0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
15ab0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
15ac0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
15ad0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
15ae0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15af0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15b00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15b10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
15b20 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78  ing && sqlite3Ex
15b30 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
15b40 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76  tes(pParse, pHav
15b50 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
15b60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15b70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72     }.    if( pOr
15b80 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66  derBy ){.      f
15b90 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
15ba0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
15bb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
15bc0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
15bd0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
15be0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
15bf0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
15c00 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15c10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
15c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15c30 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
15c40 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
15c50 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
15c60 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
15c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c80 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c  (v, OP_AggReset,
15c90 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29 2c   (pGroupBy?0:1),
15ca0 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a   pParse->nAgg);.
15cb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15cc0 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
15cd0 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
15ce0 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69   *pFunc;.      i
15cf0 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72  f( (pFunc = pPar
15d00 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
15d10 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e  c)!=0 && pFunc->
15d20 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
15d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15d40 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
15d50 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61  Init, 0, i, (cha
15d60 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e  r*)pFunc, P3_FUN
15d70 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
15d80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
15d90 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
15da0 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 4b  nt sz = sizeof(K
15db0 65 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75 70  eyInfo) + pGroup
15dc0 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66  By->nExpr*sizeof
15dd0 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20 20  (CollSeq*);.    
15de0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
15df0 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
15e00 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  iteMalloc(sz);. 
15e10 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65 79       if( 0==pKey
15e20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15e30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15e40 20 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79 2d     }.      pKey-
15e50 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64  >enc = pParse->d
15e60 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70 4b  b->enc;.      pK
15e70 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47 72  ey->nField = pGr
15e80 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
15e90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15ea0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
15eb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
15ec0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
15ed0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
15ee0 71 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  q(pParse, pGroup
15ef0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
15f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4b  .        if( !pK
15f10 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  ey->aColl[i] ){.
15f20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e            pKey->
15f30 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73  aColl[i] = pPars
15f40 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
15f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15f60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15f70 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
15f80 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29 70   addr, (char *)p
15f90 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  Key, P3_KEYINFO_
15fa0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a  HANDOFF);.    }.
15fb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
15fc0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
15fd0 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  cell to NULL for
15fe0 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66 6f   SRT_Mem or 0 fo
15ff0 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20 2a  r SRT_Exists.  *
16000 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
16010 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
16020 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
16030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16040 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53 52  dOp(v, eDest==SR
16050 54 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74 72 69 6e  T_Mem ? OP_Strin
16060 67 38 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72 2c  g8 : OP_Integer,
16070 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
16080 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16090 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
160a0 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rm, 1);.  }..  /
160b0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
160c0 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ry table to use 
160d0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
160e0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
160f0 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
16100 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
16110 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
16120 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28    openTempIndex(
16130 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74 69  pParse, p, disti
16140 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  nct, 0);.  }else
16150 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
16160 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   -1;.  }..  /* B
16170 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
16180 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57  e scan.  */.  pW
16190 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
161a0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
161b0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
161c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20 26  pGroupBy ? 0 : &
161f0 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 46 65  pOrderBy, p->pFe
16200 74 63 68 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  tch);.  if( pWIn
16210 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
16220 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55  ect_end;..  /* U
16230 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
16240 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65  inner loop if we
16250 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67   are not dealing
16260 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65   with.  ** aggre
16270 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28  gates.  */.  if(
16280 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69   !isAgg ){.    i
16290 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
162a0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
162b0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
162c0 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
162d0 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
162e0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
162f0 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
16300 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
16310 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  eak, aff) ){.   
16320 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
16330 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
16340 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
16350 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72  ealing with aggr
16360 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20  egates, then do 
16370 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72  the special aggr
16380 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65  egate.  ** proce
16390 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20  ssing.  .  */.  
163a0 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70  else{.    AggExp
163b0 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66 28  r *pAgg;.    if(
163c0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
163d0 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20     int lbl1;.   
163e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
163f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
16400 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
16410 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
16420 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
16430 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
16440 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20    }.      /* No 
16450 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16460 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
16470 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f  he following OP_
16480 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20 20  MakeRecord .    
16490 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20    ** because we 
164a0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64  do not need to d
164b0 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f  o any coercion o
164c0 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a  f datatypes. */.
164d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
164e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
164f0 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70 42  eRecord, pGroupB
16500 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
16510 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
16520 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16530 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16540 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16550 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62  _AggFocus, 0, lb
16560 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l1);.      for(i
16570 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d  =0, pAgg=pParse-
16580 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d  >aAgg; i<pParse-
16590 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67  >nAgg; i++, pAgg
165a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
165b0 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63   pAgg->isAgg ) c
165c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
165d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
165e0 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e 70  (pParse, pAgg->p
165f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
16600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16610 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c  v, OP_AggSet, 0,
16620 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
16630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16640 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
16650 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  l1);.    }.    f
16660 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61  or(i=0, pAgg=pPa
16670 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61  rse->aAgg; i<pPa
16680 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20  rse->nAgg; i++, 
16690 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 45  pAgg++){.      E
166a0 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
166b0 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  nt nExpr;.      
166c0 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
166d0 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d 3e       if( !pAgg->
166e0 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
166f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16700 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20 29  pAgg->pFunc!=0 )
16710 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16720 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53 74  pAgg->pFunc->xSt
16730 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ep!=0 );.      p
16740 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75 6e  Def = pAgg->pFun
16750 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 41  c;.      pE = pA
16760 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  gg->pExpr;.     
16770 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
16780 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16790 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pE->op==TK_AGG_F
167a0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
167b0 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   nExpr = sqlite3
167c0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
167d0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
167e0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
167f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16800 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
16810 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
16820 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
16830 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
16840 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
16850 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
16860 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70 43      for(j=0; !pC
16870 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b 20  oll && j<nExpr; 
16880 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
16890 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
168a0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
168b0 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b  e, pE->pList->a[
168c0 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
168d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
168e0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
168f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
16900 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
16910 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16920 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
16930 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
16940 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
16950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16960 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
16970 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20   OP_AggFunc, 0, 
16980 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44  nExpr, (char*)pD
16990 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  ef, P3_POINTER);
169a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
169b0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
169c0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a  e scan loop..  *
169d0 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
169e0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
169f0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f  /* If we are pro
16a00 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
16a10 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  es, we need to s
16a20 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c  et up a second l
16a30 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c  oop.  ** over al
16a40 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  l of the aggrega
16a50 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72  te values and pr
16a60 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocess them..  */
16a70 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
16a80 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d      int endagg =
16a90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16aa0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
16ab0 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20  t startagg;.    
16ac0 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74  startagg = sqlit
16ad0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16ae0 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
16af0 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
16b00 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
16b10 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
16b20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
16b30 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
16b40 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72  e, pHaving, star
16b50 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  tagg, 1);.    }.
16b60 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
16b70 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
16b80 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
16b90 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
16ba0 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c  iParm, startagg,
16bd0 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b   endagg, aff) ){
16be0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
16bf0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
16c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16c10 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
16c20 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20  , startagg);.   
16c30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16c40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61  lveLabel(v, enda
16c50 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gg);.    sqlite3
16c60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16c70 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
16c80 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
16c90 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
16ca0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
16cb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
16cc0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
16cd0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
16ce0 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
16cf0 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
16d00 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
16d10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
16d20 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
16d30 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
16d40 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
16d50 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
16d60 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Parm);.  }..#ifn
16d70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16d80 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66  SUBQUERY.  /* If
16d90 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
16da0 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
16db0 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
16dc0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
16dd0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
16de0 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65  able.  So delete
16df0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74   the subquery st
16e00 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
16e10 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20   parent.  ** to 
16e20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62  prevent this sub
16e30 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
16e40 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
16e50 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
16e60 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  e.  ** the use o
16e70 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
16e80 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
16e90 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
16ea0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
16eb0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
16ec0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
16ed0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
16ee0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
16ef0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
16f00 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
16f10 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  tDelete(p);.    
16f20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
16f30 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
16f40 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ect = 0;.  }.#en
16f50 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  dif..  /* The SE
16f60 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
16f70 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
16f80 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
16f90 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
16fa0 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
16fb0 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
16fc0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
16fd0 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
16fe0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
16ff0 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
17000 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
17010 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
17020 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
17030 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
17040 20 20 72 65 73 74 6f 72 65 41 67 67 72 65 67 61    restoreAggrega
17050 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 26  teInfo(pParse, &
17060 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 72 65 74  sAggInfo);.  ret
17070 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.