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

Artifact 31faeb619940082085e75f4cbef3f44c5e0f12d5:


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 33 39 31  select.c,v 1.391
0200: 20 32 30 30 38 2f 30 31 2f 30 37 20 31 30 3a 31   2008/01/07 10:1
0210: 36 3a 34 31 20 64 61 6e 69 65 6c 6b 31 39 37 37  6:41 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 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
02d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
02e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
02f0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0300: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
0310: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
0320: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0330: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0350: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0370: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
0380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0390: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
03a0: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
03b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
03c0: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
03d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
03e0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
03f0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
0400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
0410: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0420: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0430: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
0440: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
0450: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
0460: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
0470: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
0480: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 65 44 65  est->eDest = eDe
0490: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50 61  st;.  pDest->iPa
04a0: 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44  rm = iParm;.  pD
04b0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  est->affinity = 
04c0: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  0;.  pDest->iMem
04d0: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
04e0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
04f0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0500: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0510: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0520: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0530: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
0540: 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20  ectNew(.  Parse 
0550: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0560: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0570: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0580: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
0590: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
05a0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
05b0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
05c0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
05d0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
05e0: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
05f0: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0600: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0610: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0620: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0630: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0640: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0650: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0660: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
0670: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
0680: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
0690: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
06a0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
06b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
06d0: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
06e0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
06f0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0700: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  resent */.  Expr
0710: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0720: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0730: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0740: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0750: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0760: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0770: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0780: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0790: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
07a0: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
07b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
07c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
07d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
07e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
07f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0800: 20 61 73 73 65 72 74 28 20 21 70 4f 66 66 73 65   assert( !pOffse
0810: 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29 3b 20 20  t || pLimit );  
0820: 20 2f 2a 20 43 61 6e 27 74 20 68 61 76 65 20 4f   /* Can't have O
0830: 46 46 53 45 54 20 77 69 74 68 6f 75 74 20 4c 49  FFSET without LI
0840: 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  MIT. */.  if( pN
0850: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
0860: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0870: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
0880: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
0890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69  ;.  }.  if( pELi
08a0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c  st==0 ){.    pEL
08b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
08c0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
08d0: 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
08e0: 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30  pr(db,TK_ALL,0,0
08f0: 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  ,0), 0);.  }.  p
0900: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
0910: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  List;.  pNew->pS
0920: 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65  rc = pSrc;.  pNe
0930: 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  w->pWhere = pWhe
0940: 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  re;.  pNew->pGro
0950: 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
0960: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
0970: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e   = pHaving;.  pN
0980: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
0990: 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d  OrderBy;.  pNew-
09a0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73  >isDistinct = is
09b0: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
09c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
09d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66 66  ;.  assert( pOff
09e0: 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74  set==0 || pLimit
09f0: 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
0a00: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a10: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a20: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65  = pOffset;.  pNe
0a30: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
0a40: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0a50: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0a60: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
0a70: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
0a80: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
0a90: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0aa0: 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
0ab0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74 61    if( pNew==&sta
0ac0: 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61  ndin) {.    clea
0ad0: 72 53 65 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20  rSelect(pNew);. 
0ae0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d     pNew = 0;.  }
0af0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
0b10: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
0b20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
0b30: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
0b40: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
0b50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
0b60: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0b70: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0b80: 63 6c 65 61 72 53 65 6c 65 63 74 28 70 29 3b 0a  clearSelect(p);.
0b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
0ba0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
0bb0: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0bc0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0bd0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0be0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0bf0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0c00: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0c10: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0c20: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0c30: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0c40: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0c50: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0c60: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0c70: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0c80: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0c90: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0ca0: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0cb0: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0cc0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0cd0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0ce0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0cf0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0d00: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0d10: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0d20: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0d30: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0d40: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0d50: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0d60: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0d70: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0d80: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0d90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0da0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0db0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0dc0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0dd0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0de0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0df0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0e00: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0e10: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0e20: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0e30: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0e40: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0e50: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0e60: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0e70: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0e80: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0e90: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0ea0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0eb0: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ec0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0ed0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0ee0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0ef0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0f00: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0f10: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0f20: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0f30: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0f40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0f50: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0f60: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0f70: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0f80: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0f90: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0fa0: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0fb0: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0fc0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0fd0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0fe0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0ff0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1000: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
1010: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
1020: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
1030: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
1040: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
1050: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
1060: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
1070: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
1080: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
1090: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
10a0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
10b0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
10c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10e0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
10f0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
1100: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
1110: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1120: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1140: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1150: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1160: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1170: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1180: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1190: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
11a0: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
11c0: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
11d0: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
11e0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
11f0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
1200: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
1210: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
1220: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1230: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1240: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1250: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1260: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
1270: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
1280: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
1290: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
12a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
12b0: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
12c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12e0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
12f0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1300: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1310: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
1320: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1330: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1340: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1360: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1370: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1380: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1390: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
13a0: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
13b0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
13c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
13d0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
13e0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
13f0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1400: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1410: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1420: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1430: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1440: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1450: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1470: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1480: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1490: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
14a0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
14b0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
14c0: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
14d0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
14e0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28   *z){.  p->z = (
14f0: 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20  u8*)z;.  p->n = 
1500: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
1510: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1530: 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64  e token to the d
1540: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64  ouble-quoted and
1550: 20 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e   escaped version
1560: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
1570: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
1580: 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a  z. For example;.
1590: 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20  **.**    {a"bc} 
15a0: 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a   ->  {"a""bc"}.*
15b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
15c0: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72  tQuotedToken(Par
15d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
15e0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
15f0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28   *z){.  p->z = (
1600: 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69  u8 *)sqlite3MPri
1610: 6e 74 66 28 30 2c 20 22 5c 22 25 77 5c 22 22 2c  ntf(0, "\"%w\"",
1620: 20 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20   z);.  p->dyn = 
1630: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b  1;.  if( p->z ){
1640: 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c  .    p->n = strl
1650: 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29  en((char *)p->z)
1660: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1670: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1680: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
1690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
16a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
16b0: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
16c0: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
16d0: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
16e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
16f0: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
1700: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1710: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
1720: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
1730: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1740: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1750: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1760: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
1770: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f  , &dummy);.}.../
1780: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1790: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
17a0: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
17b0: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
17c0: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
17d0: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
17e0: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
17f0: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1800: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1810: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
1820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1840: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1860: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1870: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1880: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1890: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
18a0: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
18b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18c0: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
18d0: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
18e0: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
18f0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
1900: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
1910: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
1920: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1930: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
1940: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1950: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1960: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1970: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1980: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
1990: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
19a0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
19b0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
19c0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
19d0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
19e0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
19f0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
1a00: 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70  *pE1a, *pE1b, *p
1a10: 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  E1c;.  Expr *pE2
1a20: 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b  a, *pE2b, *pE2c;
1a30: 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20  .  Expr *pE;..  
1a40: 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1a = sqlite3Cr
1a50: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1a60: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61  e, zCol);.  pE2a
1a70: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1a80: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1a90: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  Col);.  if( zAli
1aa0: 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as1==0 ){.    zA
1ab0: 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a  lias1 = pTab1->z
1ac0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62  Name;.  }.  pE1b
1ad0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1ae0: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1af0: 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a  Alias1);.  if( z
1b00: 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20  Alias2==0 ){.   
1b10: 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32   zAlias2 = pTab2
1b20: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1b30: 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2b = sqlite3Cre
1b40: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1b50: 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45  , zAlias2);.  pE
1b60: 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  1c = sqlite3PExp
1b70: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1b80: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
1b90: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
1ba0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1bb0: 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45  TK_DOT, pE2b, pE
1bc0: 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73  2a, 0);.  pE = s
1bd0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1be0: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c  se, TK_EQ, pE1c,
1bf0: 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28   pE2c, 0);.  if(
1c00: 20 70 45 20 29 7b 0a 20 20 20 20 45 78 70 72 53   pE ){.    ExprS
1c10: 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  etProperty(pE, E
1c20: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1c30: 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54   pE->iRightJoinT
1c40: 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69  able = iRightJoi
1c50: 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  nTable;.  }.  *p
1c60: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1c70: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
1c80: 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a  b,*ppExpr, pE);.
1c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1ca0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1cb0: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
1cc0: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
1cd0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
1ce0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
1cf0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1d00: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
1d10: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
1d20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
1d30: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1d40: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1d50: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
1d60: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1d70: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1d80: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1d90: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1da0: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1db0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
1dc0: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
1dd0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
1de0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1df0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
1e00: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
1e10: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
1e20: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
1e30: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
1e40: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
1e50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
1e60: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
1e70: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
1e80: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1e90: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
1ea0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
1eb0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
1ec0: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
1ed0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
1ee0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
1ef0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
1f00: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
1f10: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
1f20: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
1f30: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
1f40: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
1f50: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
1f60: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
1f70: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
1f80: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
1f90: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
1fa0: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
1fb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1fc0: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
1fd0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
1fe0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
1ff0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2000: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2010: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2020: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2030: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2040: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2050: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2060: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2070: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2080: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2090: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
20a0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
20b0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
20c0: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
20d0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
20e0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
20f0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2100: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2110: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2120: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2130: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2140: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2150: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2160: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2170: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2180: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2190: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
21a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
21b0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52  Join);.    p->iR
21c0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
21d0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
21e0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
21f0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2200: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2210: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2220: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2230: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2240: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2250: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2260: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2270: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2280: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2290: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
22a0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
22b0: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
22c0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
22d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
22e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
22f0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2300: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2310: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2320: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2330: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2340: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2350: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2360: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2370: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2380: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2390: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
23a0: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
23b0: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
23c0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
23d0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
23e0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
23f0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2400: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2410: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2420: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2430: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2440: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2450: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2460: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2470: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2480: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2490: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
24a0: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
24b0: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
24c0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
24d0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
24e0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
24f0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2500: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2510: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
2520: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2530: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
2540: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2560: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2570: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2580: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
2590: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
25a0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
25b0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25c0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
25d0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
25e0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
25f0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
2600: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
2610: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
2620: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
2630: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2640: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
2650: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
2660: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
2670: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
2680: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
2690: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
26a0: 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20  ght->pTab;..    
26b0: 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20  if( pLeftTab==0 
26c0: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20  || pRightTab==0 
26d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
26e0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
26f0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
2700: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
2710: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
2720: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
2730: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
2740: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
2750: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
2760: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2770: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2780: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2790: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
27a0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
27b0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
27c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27d0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
27e0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
27f0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
2800: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
2810: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
2820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2840: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61  r(j=0; j<pLeftTa
2850: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2860: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2870: 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61  me = pLeftTab->a
2880: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2890: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
28a0: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
28b0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
28c0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
28d0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
28e0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
28f0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2920: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2930: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
2960: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
2970: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  );.          .  
2980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
29a0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
29b0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
29c0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
29d0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
29e0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
29f0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2a00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2a10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2a20: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2a30: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2a40: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2a50: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2a60: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2a70: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2a80: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2a90: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2aa0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2ab0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ac0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
2ad0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2ae0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2af0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73  ->pOn ){.      s
2b00: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
2b10: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
2b20: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2b30: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
2b40: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2b50: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
2b60: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
2b70: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
2b80: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2b90: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2ba0: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2bb0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2bc0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2bd0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2be0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2bf0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2c00: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2c10: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
2c20: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
2c30: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2c40: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
2c50: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
2c60: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2c70: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2c80: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2c90: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2ca0: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2cb0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2cc0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2cd0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2ce0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2cf0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
2d00: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
2d10: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
2d20: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2d30: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
2d40: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
2d50: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
2d60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2d70: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
2d80: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2d90: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
2da0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2db0: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
2dc0: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
2dd0: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
2de0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2df0: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
2e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2e10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2e20: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
2e30: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
2e40: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
2e50: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
2e60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
2e70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2e80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
2ea0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
2eb0: 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  e, zName, pLeftT
2ec0: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
2ed0: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2f00: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
2f30: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
2f40: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2f50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
2f70: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
2f80: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
2f90: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
2fa0: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
2fb0: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
2fc0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
2fd0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
2fe0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
2ff0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
3000: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
3010: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3020: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
3030: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
3040: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
3050: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
3060: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
3070: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
3080: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
3090: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
30a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
30b0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
30c0: 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20   pOrderBy, 0);. 
30d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30e0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
30f0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3100: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71 6c  ursor, 0);.  sql
3110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3120: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65  , OP_Pull, pOrde
3130: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
3140: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
3150: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61  eAddOp2(v, OP_Ma
3160: 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72  keRecord, pOrder
3170: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30  By->nExpr + 2, 0
3180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
31a0: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
31b0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
31c0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
31d0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
31e0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
31f0: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
3200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3210: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
3220: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3230: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
3240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3250: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 53 65 6c   OP_AddImm, pSel
3260: 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 2d  ect->iLimit+1, -
3270: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3290: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
32a0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
32b0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
32c0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
32d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32e0: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
32f0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29  By->iECursor, 0)
3300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3310: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
3320: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
3330: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
3340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3350: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
3360: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c  .    pSelect->iL
3370: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d  imit = -1;.  }.}
3380: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3390: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
33a0: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
33b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
33c0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
33d0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
33e0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
33f0: 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63  is VM */.  Selec
3400: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
3410: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
3420: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3430: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3440: 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue,    /* Jump 
3450: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
3460: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
3470: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
3480: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3490: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
34a0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
34b0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
34c0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26  p->iOffset>=0 &&
34d0: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
34e0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
34f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3500: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
3510: 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d  m, p->iOffset, -
3520: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
3530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3540: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c  (v, OP_IfMemNeg,
3550: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b   p->iOffset, 0);
3560: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
3570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3580: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3590: 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a  _Pop, nPop, 0);.
35a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
35b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
35c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
35d0: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
35e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
35f0: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3600: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3610: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3620: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3630: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3640: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3650: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f 70  ake sure the top
3660: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
3670: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20  he.** stack are 
3680: 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20  distinct.  iTab 
3690: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
36a0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
36b0: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
36c0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
36d0: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
36e0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
36f0: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
3700: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
3710: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
3720: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
3730: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
3740: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
3750: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
3760: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
3770: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
3780: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
3790: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
37a0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
37b0: 73 74 69 6e 63 74 5f 4f 4c 44 28 0a 20 20 56 64  stinct_OLD(.  Vd
37c0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
37d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
37e0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
37f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
3800: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
3810: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
3820: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
3830: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
3840: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3850: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3860: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3870: 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20 20 20  */.  int N      
3880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
3890: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  op N elements of
38a0: 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73 74 20   the stack must 
38b0: 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29  be distinct */.)
38c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
38d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp2(v, OP_Make
38e0: 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a  Record, -N, 0);.
38f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3900: 4f 70 32 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  Op2(v, OP_Distin
3910: 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65  ct, iTab, sqlite
3920: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3930: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
3940: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3950: 50 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b 0a  P_Pop, N+1, 0);.
3960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3970: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
3980: 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a  0, addrRepeat);.
3990: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
39a0: 2c 20 22 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  , "skip indistin
39b0: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
39c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39d0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
39e0: 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a  rt, iTab, 0);.}.
39f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3a00: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3a10: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3a20: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3a30: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
3a40: 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69  are distinct.  i
3a50: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3a60: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3a70: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3a80: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3a90: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3aa0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3ab0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3ac0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3ad0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3ae0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3af0: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3b00: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3b10: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3b20: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3b30: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3b40: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3b50: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3b60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3b70: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 56 64  deDistinct(.  Vd
3b80: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3b90: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
3ba0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
3bb0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
3bc0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
3bd0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
3be0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
3bf0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
3c00: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3c10: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3c20: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3c30: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
3c40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3c50: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
3c60: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
3c70: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
3c80: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  lement */.){.  s
3c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3ca0: 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65  (v, OP_RegMakeRe
3cb0: 63 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  c, iMem, N);.  s
3cc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3cd0: 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c  (v, OP_Distinct,
3ce0: 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64   iTab, sqlite3Vd
3cf0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3d00: 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +3);.  sqlite3Vd
3d10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
3d20: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  op, 1, 0);.  sql
3d30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3d40: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
3d50: 64 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62  drRepeat);.  Vdb
3d60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
3d70: 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65  ip indistinct re
3d80: 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69  cords"));.  sqli
3d90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3da0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3db0: 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Tab, 0);.}../*.*
3dc0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
3dd0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
3de0: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
3df0: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
3e00: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
3e10: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
3e20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
3e30: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
3e40: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
3e50: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
3e60: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
3e70: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
3e80: 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  e the error occu
3e90: 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a  rs in multiple.*
3ea0: 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  * places..*/.sta
3eb0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
3ec0: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
3ed0: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
3ee0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3ef0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
3f00: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
3f10: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
3f20: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
3f30: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
3f40: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
3f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3f60: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3f70: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
3f80: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
3f90: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
3fa0: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
3fb0: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
3fc0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
3fd0: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
3fe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3ff0: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4000: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4010: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
4020: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
4030: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
4040: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
4050: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4060: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
4070: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
4080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
4090: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
40a0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
40b0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
40c0: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
40d0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
40e0: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
40f0: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
4100: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
4110: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
4120: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
4130: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
4140: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
4150: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
4160: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
4170: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
4180: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
4190: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
41a0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
41b0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
41c0: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
41d0: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
41e0: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
41f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
4200: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
4210: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
4220: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4230: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
4240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
4250: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
4260: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4270: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
4280: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
4290: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
42a0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
42b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
42c0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
42d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
42e0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
42f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4300: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
4310: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
4320: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4330: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
4340: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
4350: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
4360: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
4370: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
4380: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
4390: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
43a0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
43b0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
43c0: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
43d0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
43e0: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
43f0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
4400: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4410: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4420: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
4430: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
4440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
4450: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
4460: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
4470: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72  r loop */.  char
4480: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
4490: 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20      /* affinity 
44a0: 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20  string if eDest 
44b0: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a  is SRT_Union */.
44c0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
44d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
44e0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20  int i, n;.  int 
44f0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
4500: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4520: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
4530: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 20 20 20  /.  int iMem;   
4540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4550: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
4560: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65  olding result se
4570: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
4580: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
4590: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
45a0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20  Dest->iParm;..  
45b0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
45c0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
45d0: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
45e0: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
45f0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
4600: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4610: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74  ement, then do t
4620: 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  he check.  ** to
4630: 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77   see if this row
4640: 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75   should be outpu
4650: 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73  t..  */.  hasDis
4660: 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74  tinct = distinct
4670: 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  >=0 && pEList->n
4680: 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f  Expr>0;.  if( pO
4690: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
46a0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
46b0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
46c0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b  , iContinue, 0);
46d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
46e0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
46f0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4700: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4710: 20 20 20 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a     n = nColumn;.
4720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d    }else{.    n =
4730: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
4740: 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d    }.  if( pDest-
4750: 3e 69 4d 65 6d 3e 30 20 29 7b 0a 20 20 20 20 69  >iMem>0 ){.    i
4760: 4d 65 6d 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65  Mem = pDest->iMe
4770: 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
4780: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 69 4d  pDest->iMem = iM
4790: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
47a0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
47b0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 3b 0a 20 20 7d 0a  >nMem += n;.  }.
47c0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
47d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
47e0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
47f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4800: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4810: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4820: 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 7d  , iMem+i);.    }
4830: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
4840: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
4850: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
4860: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
4870: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
4880: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
4890: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
48a0: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
48b0: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
48c0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
48d0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
48e0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
48f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4900: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
4910: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 4d 65  >a[i].pExpr, iMe
4920: 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m+i);.    }.  }.
4930: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 3b 0a 0a    nColumn = n;..
4940: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
4950: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
4960: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
4970: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4980: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
4990: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
49a0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
49b0: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
49c0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
49d0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
49e0: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
49f0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
4a00: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4a10: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
4a20: 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d  t->nExpr==nColum
4a30: 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73  n );.    codeDis
4a40: 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e 63  tinct(v, distinc
4a50: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43  t, iContinue, nC
4a60: 6f 6c 75 6d 6e 2c 20 69 4d 65 6d 29 3b 0a 20 20  olumn, iMem);.  
4a70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4a80: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4a90: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4aa0: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  tinue, nColumn);
4ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4ac0: 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
4ad0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
4ae0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
4af0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
4b00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4b10: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
4b20: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
4b30: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
4b40: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
4b50: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
4b60: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
4b70: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
4b80: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
4b90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4ba0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
4bb0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
4bc0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
4bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4be0: 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20   OP_RegMakeRec, 
4bf0: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
4c00: 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b        if( aff ){
4c10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4c20: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4c30: 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53 54 41 54  -1, aff, P4_STAT
4c40: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
4c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c60: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
4c70: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
4c80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4c90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
4ca0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
4cb0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
4cc0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
4cd0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
4ce0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
4cf0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
4d00: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
4d10: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
4d20: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4d30: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4d40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4d50: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
4d60: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
4d70: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4d80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67  AddOp2(v, OP_Reg
4d90: 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 6e  MakeRec, iMem, n
4da0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
4db0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4dc0: 50 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50  P4(v, -1, aff, P
4dd0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
4de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4df0: 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  p2(v, OP_NotFoun
4e00: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4e10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4e20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4e30: 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  _Delete, iParm, 
4e40: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4e50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4e60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4e70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4e80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4ea0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4eb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
4ec0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
4ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4ee0: 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
4ef0: 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b   iMem, nColumn);
4f00: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4f10: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
4f20: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4f30: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4f40: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
4f50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4f60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4f70: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
4f80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4fa0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
4fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
4fc0: 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  odeInsert(pParse
4fd0: 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f  , iParm, OPFLAG_
4fe0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 7d  APPEND);.      }
4ff0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5000: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
5010: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5020: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
5030: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
5040: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
5050: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
5060: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
5070: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
5080: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
5090: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
50a0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
50b0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
50c0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
50d0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
50e0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
50f0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5100: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
5110: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5120: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 64  n==1 );.      ad
5130: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
5140: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5150: 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30  MemNull, iMem, 0
5160: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
5170: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
5180: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
5190: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
51a0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
51b0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  y);.      if( pO
51c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
51d0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
51e0: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
51f0: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
5200: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
5210: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
5220: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
5230: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
5240: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
5250: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
5260: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
5270: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
5280: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
5290: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
52a0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
52b0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
52c0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
52d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
52e0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
52f0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
5300: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5310: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5320: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
5330: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5340: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
5350: 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69  OP_RegMakeRec, i
5360: 4d 65 6d 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61  Mem, 1, 0, &p->a
5370: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
5380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5390: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
53a0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
53b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
53c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
53d0: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
53e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
53f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
5400: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
5410: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
5420: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
5430: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
5440: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
5450: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
5460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5470: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5480: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
5490: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
54a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
54b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
54c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
54d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
54e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
54f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
5500: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5510: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5520: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
5530: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
5540: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
5550: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
5560: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
5570: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
5580: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5590: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
55a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
55b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
55c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
55d0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d  , OP_SCopy, iMem
55e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
55f0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5600: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5610: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5620: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
5630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5650: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69  v, OP_Move, 0, i
5660: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 2f  Parm);.        /
5670: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5680: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
5690: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
56a0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
56b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
56d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
56e0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
56f0: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
5700: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
5710: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
5720: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
5730: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
5740: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
5750: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
5760: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
5770: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
5780: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
5790: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
57a0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
57b0: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
57c0: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
57d0: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
57e0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
57f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5810: 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20   OP_RegMakeRec, 
5820: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
5830: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5840: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5850: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
5860: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
5870: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
5880: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
5890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
58a0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
58b0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
58c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
58d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
58e0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
58f0: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5910: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
5920: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5930: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
5940: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5950: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
5960: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
5970: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
5980: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
5990: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
59a0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
59b0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
59c0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
59d0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
59e0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
59f0: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5a00: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5a10: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5a20: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5a30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5a40: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5a50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
5a60: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
5a70: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
5a80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5a90: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
5aa0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5ab0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
5ac0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5ad0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
5ae0: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
5af0: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
5b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5b20: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5b40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d  AddOp2(v, OP_IfM
5b50: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
5b60: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5b80: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
5b90: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
5ba0: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
5bb0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
5bc0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
5bd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
5be0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
5bf0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
5c00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
5c10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
5c20: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
5c30: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
5c40: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
5c50: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
5c60: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5c70: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5c80: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5c90: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
5ca0: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
5cb0: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
5cc0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
5cd0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5ce0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
5cf0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
5d00: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
5d10: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
5d20: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
5d30: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
5d40: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
5d50: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
5d60: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5d70: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5d80: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
5d90: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
5da0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
5db0: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
5dc0: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
5dd0: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
5de0: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
5df0: 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20  .** freed.  Add 
5e00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5e10: 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34 20  cture to the P4 
5e20: 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f  field of an opco
5e30: 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b  de using.** P4_K
5e40: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
5e50: 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  s the usual way 
5e60: 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  of dealing with 
5e70: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
5e80: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
5e90: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72  FromExprList(Par
5ea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5eb0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5ec0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5ed0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
5ee0: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
5ef0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
5f00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5f10: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
5f20: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
5f30: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
5f40: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
5f50: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
5f60: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78  of(*pInfo) + nEx
5f70: 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  pr*(sizeof(CollS
5f80: 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28  eq*)+1) );.  if(
5f90: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49   pInfo ){.    pI
5fa0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5fb0: 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61  = (u8*)&pInfo->a
5fc0: 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20  Coll[nExpr];.   
5fd0: 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d   pInfo->nField =
5fe0: 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66   nExpr;.    pInf
5ff0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  o->enc = ENC(db)
6000: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
6010: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
6020: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
6030: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
6040: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
6050: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6060: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6070: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
6080: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
6090: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
60a0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
60b0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
60c0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
60d0: 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
60e0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
60f0: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65  tOrder[i] = pIte
6100: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
6110: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6120: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pInfo;.}.../*.*
6130: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
6140: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
6150: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
6160: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
6170: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
6180: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
6190: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
61a0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
61b0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
61c0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
61d0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
61e0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
61f0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
6200: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
6210: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
6220: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
6230: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
6240: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
6250: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
6260: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
6270: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6280: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
6290: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
62a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
62b0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
62c0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
62d0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
62e0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
62f0: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
6300: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
6310: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
6320: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
6330: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
6340: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
6350: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20  */.){.  int brk 
6360: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
6370: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
6380: 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56   cont = sqlite3V
6390: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
63a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
63b0: 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70  nt iTab;.  int p
63c0: 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20  seudoTab = 0;.  
63d0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
63e0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
63f0: 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ;..  int eDest =
6400: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
6410: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
6420: 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 54  st->iParm;..  iT
6430: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
6440: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
6450: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6460: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6470: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
6480: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
6490: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
64a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
64b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp2(v, OP_OpenP
64c0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
64d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
64e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
64f0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
6500: 20 70 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c   pseudoTab, nCol
6510: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  umn);.  }.  addr
6520: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
6530: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
6540: 6f 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b  ort, iTab, brk);
6550: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
6560: 20 70 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20   p, cont, 0);.  
6570: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6580: 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74  allback || eDest
6590: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
65a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
65b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
65c0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
65d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
65e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
65f0: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
6600: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29  erBy->nExpr + 1)
6610: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
6620: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
6630: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
6640: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
6650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6660: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6670: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 29  NewRowid, iParm)
6680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6690: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
66a0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
66b0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 49 6e     sqlite3CodeIn
66c0: 73 65 72 74 28 70 50 61 72 73 65 2c 20 69 50 61  sert(pParse, iPa
66d0: 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  rm, OPFLAG_APPEN
66e0: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
66f0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
6700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6710: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
6720: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
6730: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
6740: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
6750: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6760: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
6770: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6780: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
6790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  dOp2(v, OP_Pop, 
67b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
67c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
67d0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
67e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
67f0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
6800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6810: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
6820: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c 20 26  cord, 1, 0, 0, &
6830: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6850: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6860: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6870: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
6880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6890: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
68a0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
68b0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
68c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
68d0: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69  v, OP_Move, 0, i
68e0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
68f0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
6900: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
6910: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
6920: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6940: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
6950: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
6960: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
6970: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6980: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 49 6e 73    sqlite3CodeIns
6990: 65 72 74 28 70 50 61 72 73 65 2c 20 70 73 65 75  ert(pParse, pseu
69a0: 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  doTab, 0);.     
69b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
69c0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
69d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
69f0: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c  n, pseudoTab, i,
6a00: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b   pDest->iMem+i);
6a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6a20: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
6a30: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
6a40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a50: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
6a60: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
6a70: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6a90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6aa0: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
6ab0: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
6ac0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6ad0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6ae0: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
6af0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
6b00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6b10: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6b20: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6b30: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49  loop when the LI
6b40: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20  MIT is reached. 
6b50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
6b60: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mit>=0 ){.    sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b80: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
6b90: 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
6ba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  Op2(v, OP_IfMemZ
6bc0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
6bd0: 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  brk);.  }..  /* 
6be0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
6bf0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
6c00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6c10: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
6c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c30: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
6c40: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
6c50: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6c60: 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
6c70: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6c80: 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65  _Callback || eDe
6c90: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
6ca0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
6cb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6cc0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
6cd0: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a  ab, 0);.  }..}..
6ce0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
6cf0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
6d00: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
6d10: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
6d20: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
6d30: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
6d40: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
6d50: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
6d60: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
6d70: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
6d80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
6d90: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
6da0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
6db0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
6dc0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
6dd0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6de0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
6df0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
6e00: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
6e10: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
6e20: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
6e30: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
6e40: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
6e50: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
6e60: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
6e70: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
6e80: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
6e90: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
6ea0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
6eb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
6ec0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
6ed0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
6ee0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
6ef0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
6f00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6f10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
6f20: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
6f30: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
6f40: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
6f50: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
6f60: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6f70: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
6f80: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
6f90: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
6fa0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
6fb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
6fc0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
6fd0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
6fe0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
6ff0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
7000: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
7010: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
7020: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
7030: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
7040: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7050: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
7060: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
7070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
7080: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
7090: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
70a0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
70b0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
70c0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
70d0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
70e0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
70f0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
7100: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70    int j;.  if( p
7110: 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e  Expr==0 || pNC->
7120: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7130: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7140: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7150: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7160: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7170: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7180: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7190: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
71a0: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
71b0: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
71c0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
71d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
71e0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
71f0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
7200: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
7210: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7220: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7230: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7240: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7250: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7260: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7270: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7280: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7290: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
72a0: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
72b0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
72c0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
72d0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
72e0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
72f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
7300: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
7310: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7320: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
7330: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
7340: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
7350: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7360: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7370: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
7380: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
7390: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
73a0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
73b0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
73c0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
73d0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
73e0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
73f0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
7400: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
7410: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
7420: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7430: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
7440: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
7450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7460: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7470: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
7480: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
7490: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
74a0: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
74b0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
74c0: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
74d0: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
74e0: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
74f0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
7500: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
7510: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
7520: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
7530: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7540: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
7550: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
7560: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
7570: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
7580: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
7590: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
75a0: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
75b0: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
75c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
75d0: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
75e0: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
75f0: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
7600: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
7610: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
7620: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
7630: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
7640: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
7650: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
7660: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
7670: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
7680: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
7690: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
76a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
76b0: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
76c0: 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69   pTab );.      i
76d0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
76e0: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
76f0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
7700: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
7710: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
7720: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
7730: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7740: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
7750: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7760: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
7770: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
7780: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
7790: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
77a0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
77b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
77c0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
77d0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
77e0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
77f0: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
7800: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
7810: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
7820: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
7830: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
7840: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
7850: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
7860: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7870: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
7880: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
7890: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
78a0: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
78b0: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
78c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
78d0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
78e0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
78f0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
7900: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
7910: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7920: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7930: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7940: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7950: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e   0;.          sN
7960: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7970: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
7980: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7990: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
79a0: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
79b0: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
79c0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
79d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79e0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
79f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
7a00: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
7a10: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
7a20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7a30: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
7a40: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
7a50: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
7a60: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
7a70: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
7a80: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
7a90: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
7aa0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7ab0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
7ac0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
7ad0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7af0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7b00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7b10: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
7b20: 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  riginCol = pTab-
7b30: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7b40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7b50: 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20       zOriginTab 
7b60: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7b70: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
7b80: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
7b90: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
7ba0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7bb0: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
7bc0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
7bd0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
7be0: 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70  riginDb = pNC->p
7bf0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
7c00: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
7c10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c40: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7c50: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
7c60: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
7c70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7c80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
7c90: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7ca0: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
7cb0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
7cc0: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
7cd0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
7ce0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
7cf0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
7d00: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
7d10: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
7d20: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7d30: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
7d40: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
7d50: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7d60: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7d70: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e  Expr;.      sNC.
7d80: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7d90: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
7da0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
7db0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7dc0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7dd0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7de0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7df0: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7e00: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7e10: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
7e20: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7e30: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
7e40: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
7e50: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
7e60: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
7e70: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
7e80: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
7e90: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
7ea0: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
7eb0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
7ec0: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
7ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
7ee0: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
7ef0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
7f00: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
7f10: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
7f20: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
7f30: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
7f40: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
7f50: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
7f60: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
7f70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7f80: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
7f90: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
7fa0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
7fb0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
7fc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7fd0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
7fe0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
7ff0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8000: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8010: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8020: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
8030: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
8040: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
8050: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
8060: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
8070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8080: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8090: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
80a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
80b0: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
80c0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
80d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
80e0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
80f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8100: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
8110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
8120: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
8130: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
8140: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
8150: 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  OrigCol);..    /
8160: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
8170: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
8180: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
8190: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
81a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
81b0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
81c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
81d0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
81e0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
81f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
8200: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
8210: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
8220: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8230: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8240: 50 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52  PE, zType, P4_TR
8250: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8260: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8270: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8280: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
8290: 67 44 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  gDb, P4_TRANSIEN
82a0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
82b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
82c0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
82d0: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f  E, zOrigTab, P4_
82e0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
82f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8300: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8310: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
8320: 67 43 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45  gCol, P4_TRANSIE
8330: 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  NT);.  }.}../*.*
8340: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8350: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
8360: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
8370: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
8380: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
8390: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
83a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
83b0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
83c0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
83d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
83e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
83f0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
8400: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8410: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8420: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8430: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8440: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
8450: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
8460: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
8470: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
8480: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
8490: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
84a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
84b0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
84c0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
84d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
84e0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
84f0: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
8500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8510: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
8520: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
8530: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
8540: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
8550: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
8560: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8570: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8580: 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( v!=0 );.  if( 
8590: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
85a0: 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64  Set || v==0 || d
85b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
85c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
85d0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
85e0: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
85f0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8600: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8610: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8620: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8630: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8640: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8650: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8660: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
8670: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
8680: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8690: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
86a0: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
86b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
86c0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
86d0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
86e0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
86f0: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8700: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8710: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8720: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8730: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8740: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8750: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ME, zName, strle
8760: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
8770: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
8780: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
8790: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
87a0: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
87b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
87c0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
87d0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
87e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
87f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
8800: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
8810: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
8820: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
8830: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
8840: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
8850: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
8860: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8870: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8880: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
8890: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
88a0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
88b0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
88c0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
88d0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
88e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
88f0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8900: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
8910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
8920: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
8930: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
8940: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8950: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
8960: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
8970: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8980: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
8990: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
89a0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
89b0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
89c0: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
89d0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
89e0: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
89f0: 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d  es || (!shortNam
8a00: 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  es && pTabList->
8a10: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
8a20: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
8a30: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
8a40: 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20   *zTab;. .      
8a50: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
8a60: 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[j].zAlias;.
8a70: 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c          if( full
8a80: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
8a90: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
8aa0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
8ab0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8ac0: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
8ad0: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
8ae0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
8af0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8b00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8b10: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  NAME, zName, P4_
8b20: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8b40: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8b50: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8b60: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73  ME_NAME, zCol, s
8b70: 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20  trlen(zCol));.  
8b80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8b90: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
8ba0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8bc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8bd0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8be0: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
8bf0: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
8c00: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
8c10: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
8c20: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
8c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
8c40: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
8c50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
8c60: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
8c70: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
8c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8c90: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e  printf(sizeof(zN
8ca0: 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f  ame), zName, "co
8cb0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8cd0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8ce0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8cf0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
8d00: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
8d10: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
8d20: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
8d30: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
8d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
8d50: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
8d60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
8d70: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
8d80: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
8d90: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
8da0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8db0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
8dc0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
8dd0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
8de0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
8df0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
8e00: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
8e10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8e20: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
8e30: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
8e40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8e50: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
8e60: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
8e70: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
8e80: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
8e90: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
8ea0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
8eb0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
8ec0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
8ed0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
8ee0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  /../*.** Forward
8ef0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
8f00: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
8f10: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
8f20: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
8f30: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
8f40: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
8f50: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
8f60: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
8f70: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
8f80: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
8f90: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
8fa0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
8fb0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
8fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
8fd0: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
8fe0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
8ff0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
9000: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
9010: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
9020: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
9030: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9040: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9050: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
9060: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
9070: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
9080: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70  rior;.  if( prep
9090: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
90a0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
90b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
90c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
90d0: 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
90e0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20  se, pSelect, 0) 
90f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9100: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
9110: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9120: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
9130: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
9140: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
9150: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
9160: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
9170: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62  ab->zName = zTab
9180: 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 44 62  Name ? sqlite3Db
9190: 53 74 72 44 75 70 28 64 62 2c 20 7a 54 61 62 4e  StrDup(db, zTabN
91a0: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
91b0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
91c0: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
91d0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
91e0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
91f0: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
9200: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
9210: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
9220: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
9230: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
9240: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20  )*pTab->nCol);. 
9250: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
9260: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
9270: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
9280: 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70  .    Expr *p, *p
9290: 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  R;.    char *zTy
92a0: 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pe;.    char *zN
92b0: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61  ame;.    int nNa
92c0: 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  me;.    CollSeq 
92d0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
92e0: 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  cnt;.    NameCon
92f0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20  text sNC;.    . 
9300: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
9310: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
9320: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
9330: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69   */.    p = pELi
9340: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
9350: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9360: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Right==0 || p->p
9370: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  Right->token.z==
9380: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
9390: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b  token.z[0]!=0 );
93a0: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
93b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
93c0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
93d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
93e0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
93f0: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
9400: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
9410: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
9420: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9430: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
9440: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
9450: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
9460: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
9470: 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67    && (pR=p->pRig
9480: 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f  ht)!=0 && pR->to
9490: 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b  ken.z && pR->tok
94a0: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
94b0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
94c0: 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20  of the from A.B 
94d0: 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d  use B as the nam
94e0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
94f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9500: 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 52 2d  f(db, "%T", &pR-
9510: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c  >token);.    }el
9520: 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a  se if( p->span.z
9530: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
9540: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65   ){.      /* Use
9550: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
9560: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
9570: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
9580: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
9590: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
95a0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22  MPrintf(db, "%T"
95b0: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
95c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
95d0: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
95e0: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
95f0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
9600: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9610: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
9620: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ", i+1);.    }. 
9630: 20 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c     if( !zName ||
9640: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9650: 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d ){.      db->m
9660: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
9670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9680: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
9690: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
96a0: 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20  able(pTab);.    
96b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
96c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  }.    sqlite3Deq
96d0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  uote(zName);..  
96e0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
96f0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
9700: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
9710: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
9720: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
9730: 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f  end a integer to
9740: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
9750: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
9760: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
9770: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
9780: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
9790: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
97a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
97b0: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
97c0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
97d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
97e0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
97f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
9800: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9810: 28 64 62 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e  (db, "%z:%d", zN
9820: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
9830: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
9840: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
9850: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9860: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f   }.    }.    pCo
9870: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
9880: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  ;..    /* Get th
9890: 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65  e typename, type
98a0: 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63   affinity, and c
98b0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
98c0: 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
98d0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
98e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
98f0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
9900: 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
9910: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
9920: 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  rc;.    zType = 
9930: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9940: 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  db, columnType(&
9950: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
9960: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  );.    pCol->zTy
9970: 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20  pe = zType;.    
9980: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
9990: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
99a0: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f  nity(p);.    pCo
99b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
99c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
99d0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
99e0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
99f0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
9a00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
9a10: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
9a20: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
9a30: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
9a40: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
9a50: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
9a60: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
9a70: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
9a80: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
9a90: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
9aa0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
9ab0: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
9ac0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
9ad0: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
9ae0: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
9af0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9b00: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
9b10: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
9b20: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
9b30: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
9b40: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
9b50: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
9b60: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
9b70: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
9b80: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
9b90: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
9ba0: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
9bb0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
9bc0: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
9bd0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
9be0: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
9bf0: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
9c00: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
9c10: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
9c20: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
9c30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
9c40: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
9c50: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
9c60: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
9c70: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
9c80: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
9c90: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
9ca0: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
9cb0: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
9cc0: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
9cd0: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
9ce0: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
9cf0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
9d00: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
9d10: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
9d20: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
9d30: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
9d40: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
9d50: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
9d60: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
9d70: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
9d80: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
9d90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9da0: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
9db0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
9dc0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
9dd0: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
9de0: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
9df0: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
9e00: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
9e10: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
9e20: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9e30: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
9e40: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
9e50: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
9e60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
9e70: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
9e80: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
9e90: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
9ea0: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
9eb0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
9ec0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
9ed0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
9ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
9ef0: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
9f00: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9f10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
9f20: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
9f30: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
9f40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9f50: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
9f60: 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
9f70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9f80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
9f90: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53  f( p==0 || p->pS
9fa0: 72 63 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  rc==0 || db->mal
9fb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9fc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9fd0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
9fe0: 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
9ff0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
a000: 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
a010: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
a020: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
a030: 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
a040: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
a050: 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
a060: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
a070: 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
a080: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
a090: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
a0a0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
a0b0: 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
a0c0: 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
a0d0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
a0e0: 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
a0f0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
a100: 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
a110: 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
a120: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
a130: 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
a140: 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
a150: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
a160: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
a170: 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
a180: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
a190: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
a1a0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
a1b0: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
a1c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a1d0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
a1e0: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
a1f0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
a200: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a210: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
a220: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
a230: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
a240: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
a250: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
a260: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
a270: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
a280: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
a290: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a2a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a2b0: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
a2c0: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
a2d0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
a2e0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a2f0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
a300: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
a310: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
a320: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
a330: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
a340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
a350: 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
a360: 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
a370: 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70   (void*)pFrom->p
a380: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
a390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a3a0: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
a3b0: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
a3c0: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
a3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75       sqlite3Resu
a3e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
a3f0: 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c  arse, pFrom->zAl
a400: 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ias, pFrom->pSel
a410: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
a420: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
a430: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a440: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68     }.      /* Th
a450: 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69  e isEphem flag i
a460: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
a470: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
a480: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
a490: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
a4a0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
a4b0: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
a4c0: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
a4d0: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
a4e0: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
a4f0: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
a500: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
a510: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
a520: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
a530: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
a540: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
a550: 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e  isEphem = 1;.#en
a560: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
a570: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
a580: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
a590: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
a5a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
a5b0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a5c0: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a5d0: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a5e0: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a5f0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
a600: 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d  ble(pParse,pFrom
a610: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
a620: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
a630: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a640: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a660: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
a670: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a680: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
a690: 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
a6a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a6b0: 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
a6c0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
a6d0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
a6e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
a6f0: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
a700: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
a710: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
a720: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a730: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
a740: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
a750: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
a760: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a780: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
a790: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
a7a0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
a7b0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
a7c0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
a7d0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
a7e0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
a7f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
a800: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
a810: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
a820: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
a830: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
a840: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
a850: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
a860: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a870: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
a880: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
a890: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
a8a0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a8b0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
a8c0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
a8d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a8e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
a8f0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
a900: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
a910: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
a920: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
a930: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
a940: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
a950: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
a960: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
a970: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
a980: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
a990: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
a9a0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
a9b0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
a9c0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
a9d0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
a9e0: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
a9f0: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
aa00: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
aa10: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
aa20: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
aa30: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
aa40: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
aa50: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
aa60: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
aa70: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
aa80: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
aa90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
aaa0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
aab0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
aac0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
aad0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
aae0: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
aaf0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
ab00: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
ab10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
ab20: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
ab30: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
ab40: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
ab50: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
ab60: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
ab70: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
ab80: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
ab90: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
aba0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
abb0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
abc0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
abd0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
abe0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
abf0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
ac00: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
ac10: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
ac20: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
ac30: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
ac40: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
ac50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
ac60: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
ac70: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
ac80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
ac90: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
aca0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
acb0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
acc0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
acd0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
ace0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
acf0: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
ad00: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
ad10: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
ad20: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
ad30: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
ad40: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
ad50: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
ad60: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
ad70: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
ad80: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
ad90: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
ada0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
adb0: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
adc0: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
add0: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
ade0: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
ae10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
ae20: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
ae30: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
ae40: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
ae50: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
ae60: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
ae70: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
ae80: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
ae90: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
aea0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
aeb0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
aec0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
aed0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
aee0: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
aef0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
af00: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
af10: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
af20: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
af30: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
af40: 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
af50: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
af60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
af70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
af80: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
af90: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
afa0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
afb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
afc0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
afd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
afe0: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
aff0: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
b000: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
b010: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
b020: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b030: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
b040: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
b050: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
b060: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
b070: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
b080: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
b090: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
b0a0: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
b0b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
b0c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
b0d0: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
b0e0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
b0f0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
b100: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
b110: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
b120: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
b130: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b140: 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  , &pE->pLeft->to
b150: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
b160: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
b170: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
b180: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
b190: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
b1a0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
b1b0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
b1c0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
b1d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b1e0: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
b1f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
b200: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
b210: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
b220: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
b230: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
b240: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
b250: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
b260: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
b270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b280: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
b290: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
b2a0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
b2b0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
b2d0: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
b2e0: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
b2f0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b300: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
b310: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
b320: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
b330: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
b340: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
b350: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
b360: 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b  *pExpr, *pRight;
b370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
b380: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
b390: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
b3a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
b3b0: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
b3c0: 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
b3d0: 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
b3e0: 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
b3f0: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
b400: 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
b410: 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
b420: 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
b430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
b440: 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
b450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
b460: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b470: 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
b480: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
b490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b4a0: 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
b4b0: 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
b4c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b4f0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
b500: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
b510: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20  ist_item *pLeft 
b520: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
b530: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
b540: 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d     if( (pLeft[1]
b550: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
b560: 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20  ATURAL)!=0 &&.  
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
b590: 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a  x(pLeft->pTab, z
b5a0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b5c0: 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
b5d0: 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
b5e0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
b5f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b600: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
b610: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
b620: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b630: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
b660: 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b  ListIndex(pLeft[
b670: 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  1].pUsing, zName
b680: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
b690: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
b6a0: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
b6b0: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
b6c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b6e0: 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
b6f0: 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
b700: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b720: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b750: 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
b760: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b770: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
b780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b790: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
b7a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b7b0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
b7c0: 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e  Parse, &pRight->
b7d0: 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20  token, zName);. 
b7e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
b7f0: 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67  TabName && (long
b800: 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
b810: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
b830: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
b840: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b850: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b870: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b880: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
b890: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
b8a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b8b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
b8c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
b8d0: 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
b8e0: 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
b8f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54  pLeft->token, zT
b900: 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
b910: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
b920: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20  &pExpr->span, . 
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
b950: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
b960: 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a  bName, zName));.
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b980: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
b990: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
b9a0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
b9b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b9c0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
b9d0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b9e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
b9f0: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
ba00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ba20: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
ba30: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ba40: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
ba50: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
ba60: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
ba70: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
ba80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ba90: 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
baa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
bab0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bac0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
bad0: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
bae0: 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  pr, &pExpr->span
baf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
bb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bb10: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
bb20: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
bb30: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
bb40: 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74  Expr, &pRight->t
bb50: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
bb60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
bb70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb80: 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
bb90: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
bba0: 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
bbb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bbc0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bbd0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
bbe0: 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
bbf0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
bc10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bc20: 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
bc30: 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
bc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc50: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
bc60: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
bc70: 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29  te3_free(zTName)
bc80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
bca0: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
bcb0: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
bcc0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
bcd0: 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
bce0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
bcf0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  >SQLITE_MAX_COLU
bd00: 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MN ){.    sqlite
bd10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bd20: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
bd30: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
bd40: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
bd50: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
bd60: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bd70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63  Failed ){.    rc
bd80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
bd90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bda0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73  ;.}../*.** pE is
bdb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
bdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63   expression whic
bdd0: 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65  h is a single te
bde0: 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42  rm in.** ORDER B
bdf0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
be00: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ause..**.** If p
be10: 45 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  E evaluates to a
be20: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
be30: 6e 74 20 69 2c 20 74 68 65 6e 20 72 65 74 75 72  nt i, then retur
be40: 6e 20 69 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  n i..** This is 
be50: 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f  an indication to
be60: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
be70: 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 0a   it should sort.
be80: 2a 2a 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  ** by the i-th c
be90: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
bea0: 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  ult set..**.** I
beb0: 66 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66  f pE is a well-f
bec0: 6f 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ormed expression
bed0: 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20   and the SELECT 
bee0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
bef0: 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68  not compound, th
bf00: 65 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68  en return 0.  Th
bf10: 69 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20  is indicates to 
bf20: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68  the.** caller th
bf30: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
bf40: 74 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f  t by the value o
bf50: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  f the ORDER BY.*
bf60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
bf70: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
bf80: 54 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74  T is compound, t
bf90: 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  hen attempt to m
bfa0: 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a  atch pE against.
bfb0: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  ** result set co
bfc0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66  lumns in the lef
bfd0: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
bfe0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
bff0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20  .** the index i 
c000: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
c010: 63 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e  column, as an in
c020: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
c030: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20  .** caller that 
c040: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
c050: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
c060: 6e 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a  n.  If there is.
c070: 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  ** no match, ret
c080: 75 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65  urn -1 and leave
c090: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c0a0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
c0b0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
c0c0: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
c0d0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
c0e0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
c0f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
c100: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
c110: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
c120: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65  Select,   /* The
c130: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c140: 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  t with the ORDER
c150: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c160: 45 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20  Expr *pE,       
c170: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
c180: 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ic ORDER BY term
c190: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
c1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e           /* When
c1b0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
c1c0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
c1d0: 69 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f  isCompound,    /
c1e0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
c1f0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
c200: 45 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61  ECT */.  u8 *pHa
c210: 73 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54  sAgg        /* T
c220: 72 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f  rue if expressio
c230: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
c240: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
c260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c270: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
c280: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c290: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73    /* The columns
c2a0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
c2b0: 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  et */.  NameCont
c2c0: 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61  ext nc;    /* Na
c2d0: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72  me context for r
c2e0: 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a  esolving pE */..
c2f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72  .  /* If the ter
c300: 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  m is an integer 
c310: 63 6f 6e 73 74 61 6e 74 2c 20 72 65 74 75 72 6e  constant, return
c320: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
c330: 61 74 0a 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74  at.  ** constant
c340: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
c350: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
c360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
c370: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
c380: 69 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 3c  i) ){.    if( i<
c390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
c3a0: 66 20 69 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  f i is too small
c3b0: 2c 20 6d 61 6b 65 20 69 74 20 74 6f 6f 20 62 69  , make it too bi
c3c0: 67 2e 20 20 54 68 61 74 20 77 61 79 20 74 68 65  g.  That way the
c3d0: 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   calling.      *
c3e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 74 69 6c 6c  * function still
c3f0: 20 73 65 65 73 20 61 20 76 61 6c 75 65 20 74 68   sees a value th
c400: 61 74 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e  at is out of ran
c410: 67 65 2c 20 62 75 74 20 64 6f 65 73 0a 20 20 20  ge, but does.   
c420: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 66 75 73     ** not confus
c430: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  e the column num
c440: 62 65 72 20 77 69 74 68 20 30 20 6f 72 20 2d 31  ber with 0 or -1
c450: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
c460: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d      */.      i =
c470: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
c480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
c490: 72 6e 20 69 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn i;.  }..  /* 
c4a0: 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
c4b0: 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69   simple identifi
c4c0: 65 72 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d  er that try to m
c4d0: 61 74 63 68 20 74 68 61 74 20 69 64 65 6e 74 69  atch that identi
c4e0: 66 69 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73  fier.  ** agains
c4f0: 74 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  t a column name 
c500: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c510: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  t..  */.  if( pE
c520: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28  ->op==TK_ID || (
c530: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
c540: 47 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  G && pE->token.z
c550: 5b 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20  [0]!='\'') ){.  
c560: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c570: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
c580: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c  char *zCol = sql
c590: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
c5a0: 6e 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e  n(db, &pE->token
c5b0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d  );.    if( zCol=
c5c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
c5d0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
c5e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
c5f0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c600: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73  .      char *zAs
c610: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
c620: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
c630: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
c640: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
c650: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
c660: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c670: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  zCol);.        r
c680: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
c690: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
c6a0: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b  ite3_free(zCol);
c6b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
c6c0: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20  ve all names in 
c6d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
c6e0: 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  m expression.  *
c6f0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20  /.  memset(&nc, 
c700: 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a  0, sizeof(nc));.
c710: 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50    nc.pParse = pP
c720: 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c  arse;.  nc.pSrcL
c730: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
c740: 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74  Src;.  nc.pEList
c750: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e   = pEList;.  nc.
c760: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
c770: 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nc.nErr = 0;.  i
c780: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
c790: 73 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20  solveNames(&nc, 
c7a0: 70 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  pE) ){.    if( i
c7b0: 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
c7c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
c7d0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
c7e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c800: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
c810: 20 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73    }.  if( nc.has
c820: 41 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29  Agg && pHasAgg )
c830: 7b 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d  {.    *pHasAgg =
c840: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f   1;.  }..  /* Fo
c850: 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
c860: 45 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ECT, we need to 
c870: 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
c880: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65   ORDER BY.  ** e
c890: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
c8a0: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
c8b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c8c0: 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  t.  */.  if( isC
c8d0: 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66  ompound ){.    f
c8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c8f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c900: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c910: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69  ExprCompare(pELi
c920: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
c930: 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pE) ){.        r
c940: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
c950: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
c960: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
c970: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
c980: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
c990: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
c9a0: 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74  simple SELECT st
c9b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75  atement..** Retu
c9c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
c9d0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
c9e0: 0a 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f  .** Every term o
c9f0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  f the ORDER BY o
ca00: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
ca10: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e  e needs to be an
ca20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
ca30: 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   If any expressi
ca40: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
ca50: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a   constant, then.
ca60: 2a 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ** that expressi
ca70: 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  on is replaced b
ca80: 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  y the correspond
ca90: 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  ing .** expressi
caa0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  on from the resu
cab0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
cac0: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64  c int processOrd
cad0: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72  erGroupBy(.  Par
cae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
caf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
cb00: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
cb10: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
cb20: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
cb30: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
cb40: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
cb50: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
cb60: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  the clause */.  
cb70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
cb80: 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
cb90: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
cba0: 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
cbb0: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
cbc0: 74 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20  t isOrder,      
cbd0: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44      /* 1 for ORD
cbe0: 45 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52  ER BY.  0 for GR
cbf0: 4f 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a  OUP BY */.  u8 *
cc00: 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20  pHasAgg         
cc10: 20 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45    /* Set to TRUE
cc20: 20 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e   if any term con
cc30: 74 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61  tains an aggrega
cc40: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
cc50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cc60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cc70: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
cc80: 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
cc90: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
cca0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
ccb0: 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
ccc0: 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
ccd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
cce0: 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f  e = isOrder ? "O
ccf0: 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b  RDER" : "GROUP";
cd00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cd10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
cd20: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
cd30: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
cd40: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
cd50: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
cd60: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
cd70: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
cd80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
cd90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
cda0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
cdb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cdc0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
cdd0: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
cde0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
cdf0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63  .    iCol = matc
ce00: 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  hOrderByTermToEx
ce10: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
ce20: 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c  Select, pE, i+1,
ce30: 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20   0, pHasAgg);.  
ce40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ce50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ce60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
ce70: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
ce80: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
ce90: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73  char *zType = is
cea0: 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20  Order ? "ORDER" 
ceb0: 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20  : "GROUP";.     
cec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ced0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
cee0: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
cef0: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
cf00: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
cf10: 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
cf20: 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 7a   and %d", i+1, z
cf30: 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Type, pEList->nE
cf40: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
cf50: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
cf60: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
cf70: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
cf80: 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a  ll = pE->pColl;.
cf90: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
cfa0: 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20 45 50  = pE->flags & EP
cfb0: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
cfc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
cfd0: 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
cfe0: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
cff0: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d000: 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
d010: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
d020: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
d030: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  E;.      if( pCo
d040: 6c 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20  ll && flags ){. 
d050: 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c         pE->pColl
d060: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
d070: 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66    pE->flags |= f
d080: 6c 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lags;.      }.  
d090: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d0a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
d0b0: 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
d0c0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
d0d0: 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
d0e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
d0f0: 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
d100: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
d110: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 63  ..**.** The proc
d120: 65 73 73 69 6e 67 20 64 65 70 65 6e 64 73 20 6f  essing depends o
d130: 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 53 45  n whether the SE
d140: 4c 45 43 54 20 69 73 20 73 69 6d 70 6c 65 20 6f  LECT is simple o
d150: 72 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46  r compound..** F
d160: 6f 72 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45  or a simple SELE
d170: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 65 76  CT statement, ev
d180: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
d190: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
d1a0: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 6e 65   BY.** clause ne
d1b0: 65 64 73 20 74 6f 20 62 65 20 61 6e 20 65 78 70  eds to be an exp
d1c0: 72 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79  ression.  If any
d1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
d1e0: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  n integer.** con
d1f0: 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
d200: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
d210: 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63  eplaced by the c
d220: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a  orresponding .**
d230: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
d240: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
d250: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f  .**.** For compo
d260: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
d270: 6d 65 6e 74 73 2c 20 65 76 65 72 79 20 65 78 70  ments, every exp
d280: 72 65 73 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f  ression needs to
d290: 20 62 65 20 6f 66 0a 2a 2a 20 74 79 70 65 20 54   be of.** type T
d2a0: 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20 61 20  K_COLUMN with a 
d2b0: 69 54 61 62 6c 65 20 76 61 6c 75 65 20 61 73 20  iTable value as 
d2c0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 34 74 68  given in the 4th
d2d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49   parameter..** I
d2e0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
d2f0: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
d300: 74 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65  that becomes the
d310: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a   column number..
d320: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 61  ** Otherwise, ma
d330: 74 63 68 20 74 68 65 20 65 78 70 72 65 73 73 69  tch the expressi
d340: 6f 6e 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  on against resul
d350: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 66 72  t set columns fr
d360: 6f 6d 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  om.** the left-m
d370: 6f 73 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73  ost SELECT..*/.s
d380: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
d390: 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  sCompoundOrderBy
d3a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d3b0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
d3c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c  sing context.  L
d3d0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
d3e0: 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ges here */.  Se
d3f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
d400: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
d410: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
d420: 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52  aining the ORDER
d430: 20 42 59 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   BY */.  int iTa
d440: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ble            /
d450: 2a 20 4f 75 74 70 75 74 20 74 61 62 6c 65 20 66  * Output table f
d460: 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  or compound SELE
d470: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
d480: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  .){.  int i;.  E
d490: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d4a0: 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  y;.  ExprList *p
d4b0: 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
d4c0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65   *db;.  int more
d4d0: 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72  ToDo = 1;..  pOr
d4e0: 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d  derBy = pSelect-
d4f0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
d500: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
d510: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
d520: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53  OrderBy->nExpr>S
d530: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
d540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d560: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
d570: 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  in ORDER BY clau
d580: 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  se");.    return
d590: 20 31 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70   1;.  }.  db = p
d5a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
d5b0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
d5c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d5d0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
d5e0: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ].done = 0;.  }.
d5f0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
d600: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d610: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
d620: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  t->pPrior;.  }. 
d630: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20   while( pSelect 
d640: 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20  && moreToDo ){. 
d650: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b     moreToDo = 0;
d660: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d670: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d680: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
d690: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70   iCol;.      Exp
d6a0: 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20  r *pE, *pDup;.  
d6b0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
d6c0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
d6d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
d6e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
d6f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
d700: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
d710: 72 44 75 70 28 64 62 2c 20 70 45 29 3b 0a 20 20  rDup(db, pE);.  
d720: 20 20 20 20 69 66 28 20 70 44 75 70 3d 3d 30 20      if( pDup==0 
d730: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d740: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d750: 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f     iCol = matchO
d760: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
d770: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
d780: 6c 65 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c  lect, pDup, i+1,
d790: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
d7a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d7b0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
d7c0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d7d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d7e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
d7f0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
d800: 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ist;.      if( p
d810: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
d820: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d830: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d840: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
d850: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
d860: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d870: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
d880: 20 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74    "%r ORDER BY t
d890: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
d8a0: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
d8b0: 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
d8c0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b  en 1 and %d", i+
d8d0: 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1, pEList->nExpr
d8e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
d8f0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d900: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
d910: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  .        pE->op 
d920: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
d930: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
d940: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
d950: 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b    pE->iAgg = -1;
d960: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f  .        pE->iCo
d970: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 2d 31 3b 0a 20  lumn = iCol-1;. 
d980: 20 20 20 20 20 20 20 70 45 2d 3e 70 54 61 62 20         pE->pTab 
d990: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
d9a0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
d9b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
d9c0: 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54  e{.        moreT
d9d0: 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oDo = 1;.      }
d9e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65  .    }.    pSele
d9f0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e  ct = pSelect->pN
da00: 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ext;.  }.  for(i
da10: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
da20: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
da30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
da40: 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20  [i].done==0 ){. 
da50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
da60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 72  rMsg(pParse, "%r
da70: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64   ORDER BY term d
da80: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
da90: 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  y ".            
daa0: 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72  "column in the r
dab0: 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29  esult set", i+1)
dac0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
dad0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
dae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
daf0: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
db00: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
db10: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
db20: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
db30: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
db40: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
db50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
db60: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
db70: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
db80: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
db90: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
dba0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
dbb0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
dbc0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
dbd0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
dbe0: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
dbf0: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
dc00: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
dc10: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
dc20: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
dc30: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
dc40: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
dc50: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
dc60: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
dc70: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
dc80: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
dc90: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
dca0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
dcb0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
dcc0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
dcd0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
dce0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
dcf0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
dd00: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
dd10: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
dd20: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
dd30: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
dd40: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
dd50: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
dd60: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
dd70: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
dd80: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
dd90: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
dda0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
ddb0: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
ddc0: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
ddd0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
dde0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
ddf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
de00: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
de10: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
de20: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
de30: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
de40: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
de50: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
de60: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
de70: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
de80: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
de90: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
dea0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
deb0: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
dec0: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
ded0: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
dee0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
def0: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
df00: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
df10: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
df20: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
df30: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
df40: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
df50: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
df60: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
df70: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
df80: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
df90: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
dfa0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
dfb0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
dfc0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
dfd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
dfe0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
dff0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e000: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e010: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
e020: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
e030: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
e040: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
e050: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20  ddr1, addr2;..  
e060: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
e070: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
e080: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
e090: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
e0a0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
e0b0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
e0c0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
e0d0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
e0e0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
e0f0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
e100: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
e110: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
e120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e130: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
e140: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
e150: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e160: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
e170: 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71  em++;.    v = sq
e180: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e190: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e1a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e1b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e1c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
e1d0: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
e1e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e1f0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
e200: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e220: 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 4c 69 6d 69  P_Move, 0, iLimi
e230: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
e240: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
e250: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
e260: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e270: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
e280: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
e290: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e2a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
e2b0: 43 6f 70 79 2c 20 69 4c 69 6d 69 74 2c 20 30 29  Copy, iLimit, 0)
e2c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
e2d0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
e2e0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
e2f0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
e300: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
e310: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e320: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
e330: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
e340: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e350: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
e360: 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  et, 0);.    sqli
e370: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e380: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
e390: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e3a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
e3b0: 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 3f 20 4f 50  ->pLimit==0 ? OP
e3c0: 5f 4d 6f 76 65 20 3a 20 4f 50 5f 43 6f 70 79 2c  _Move : OP_Copy,
e3d0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
e3e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e3f0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
e400: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
e410: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e420: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  Op2(v, OP_IfMemP
e430: 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b  os, iOffset, 0);
e440: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70  AddOp2(v, OP_Pop
e460: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
e470: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e480: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
e490: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e4a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e4b0: 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20  addr1);.    if( 
e4c0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
e4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e4e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp2(v, OP_Add, 
e4f0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
e500: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
e510: 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20   ){.    addr1 = 
e520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e530: 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  2(v, OP_IfMemPos
e540: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
e550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e560: 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  Op2(v, OP_Pop, 1
e570: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e580: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e590: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
e5a0: 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64  Limit+1);.    ad
e5b0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
e5c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
e5d0: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  to, 0, 0);.    s
e5e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e5f0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
e600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e610: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
e620: 30 2c 20 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  0, iLimit+1);.  
e630: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e640: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
e650: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
e660: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e670: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
e680: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
e690: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
e6a0: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
e6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e6c0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
e6d0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
e6e0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
e6f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
e700: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
e710: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
e720: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
e730: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
e740: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
e750: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
e760: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
e770: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e780: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
e790: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f  rse->pVdbe, OP_O
e7a0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
e7d0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
e7e0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29  rderBy->nExpr+1)
e7f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e800: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e810: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d   == -1 );.    p-
e820: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e830: 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a   = addr;.  }.}..
e840: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e850: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
e860: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
e870: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
e880: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e890: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
e8a0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
e8b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e8c0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
e8d0: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
e8e0: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
e8f0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
e900: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
e910: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
e920: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
e930: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
e940: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
e950: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
e960: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
e970: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
e980: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
e990: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
e9a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
e9b0: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
e9c0: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
e9d0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
e9e0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
e9f0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
ea00: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
ea10: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
ea20: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
ea30: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
ea40: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
ea50: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
ea60: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
ea70: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
ea80: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
ea90: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
eaa0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
eab0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
eac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ead0: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
eae0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eaf0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
eb00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eb10: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
eb20: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
eb30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
eb40: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71  d to process a q
eb50: 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61  uery that is rea
eb60: 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a  lly the union.**
eb70: 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e   or intersection
eb80: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
eb90: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
eba0: 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  ..**.** "p" poin
ebb0: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
ebc0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
ebd0: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
ebe0: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
ebf0: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
ec00: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
ec10: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
ec20: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
ec30: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
ec40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ec50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
ec60: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
ec70: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
ec80: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
ec90: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
eca0: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
ecb0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
ecc0: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
ecd0: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
ece0: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
ecf0: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
ed00: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
ed10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
ed20: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
ed30: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
ed40: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
ed50: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
ed60: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
ed70: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
ed80: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
ed90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
eda0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
edb0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
edc0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
edd0: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
ede0: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
ee00: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
ee10: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
ee20: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
ee30: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
ee40: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
ee50: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
ee60: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
ee70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ee80: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
ee90: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
eea0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
eeb0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
eec0: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
eed0: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
eee0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
eef0: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
ef00: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
ef10: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
ef20: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
ef30: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
ef40: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
ef50: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
ef60: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
ef70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
ef80: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
ef90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
efa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
efb0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
efc0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
efd0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
efe0: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
eff0: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
f000: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
f010: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
f020: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
f030: 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  lts */.  char *a
f040: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
f050: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
f060: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
f070: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
f080: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f090: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
f0a0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
f0b0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f0c0: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
f0d0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
f0e0: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
f0f0: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
f100: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f120: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f130: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
f140: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f160: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f170: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
f180: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f190: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
f1a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f1b0: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
f1c0: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
f1d0: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
f1e0: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
f1f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f200: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
f210: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
f220: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
f230: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
f240: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f250: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f260: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f270: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  stination */..  
f280: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 0a  dest = *pDest;..
f290: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f2a0: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
f2b0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
f2c0: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
f2d0: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
f2e0: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
f2f0: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
f300: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
f310: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
f320: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
f330: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
f340: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
f350: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f360: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f370: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
f380: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
f390: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f3a0: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
f3b0: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
f3c0: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f3d0: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
f3e0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
f3f0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
f400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f410: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
f420: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
f430: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f440: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f450: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f460: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f470: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f480: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f490: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
f4a0: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
f4b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f4c0: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
f4d0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
f4e0: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
f4f0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
f500: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
f510: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
f520: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f530: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f540: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
f550: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
f560: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
f570: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
f580: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
f590: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f5a0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f5b0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
f5c0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f5d0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f5e0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
f5f0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
f600: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f610: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
f620: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
f630: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
f640: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f650: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f660: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
f670: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
f680: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
f690: 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b  ) );.    aSetP2[
f6a0: 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69  nSetP2++] = sqli
f6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f6c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f6d0: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 30  l, dest.iParm, 0
f6e0: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
f6f0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
f700: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f710: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f720: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f730: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f740: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
f750: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
f760: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f770: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f780: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
f790: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
f7a0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
f7b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
f7c0: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
f7d0: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
f7e0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
f7f0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f800: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
f810: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
f820: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f830: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f840: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
f850: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
f860: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
f870: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f880: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f8b0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f8c0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
f8d0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
f8e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
f8f0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f900: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f910: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
f920: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
f930: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
f940: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
f950: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f970: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
f980: 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  p->iLimit, 0);. 
f990: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
f9a0: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
f9b0: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
f9c0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
f9d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
f9e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f9f0: 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 2c  Parse, p, &dest,
fa00: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
fa10: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
fa20: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
fa30: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
fa40: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fa50: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fa60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fa70: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
fa80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fa90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
faa0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
fab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fad0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
fae0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
faf0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
fb00: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
fb10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
fb20: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
fb30: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
fb40: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
fb50: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
fb60: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
fb70: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
fb80: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
fb90: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
fba0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
fbb0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
fbc0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
fbd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
fbe0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
fbf0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
fc00: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
fc10: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
fc20: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
fc30: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
fc40: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
fc50: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
fc60: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
fc70: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
fc80: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
fc90: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72  ndest;..      pr
fca0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
fcb0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
fcc0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
fcd0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
fce0: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
fcf0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
fd00: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
fd10: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fd20: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
fd30: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
fd40: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
fd50: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
fd60: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
fd70: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
fd80: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
fd90: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
fda0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fdb0: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
fdc0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
fdd0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
fde0: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
fdf0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
fe00: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
fe10: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
fe20: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
fe30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fe40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 6f  .        if( pro
fe50: 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  cessCompoundOrde
fe60: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 75  rBy(pParse, p, u
fe70: 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20 20 20  nionTab) ){.    
fe80: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
fe90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fea0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
feb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fec0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
fed0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fee0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
fef0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
ff00: 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70       if( priorOp
ff10: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
ff20: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ff30: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
ff40: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
ff50: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
ff60: 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65        aSetP2[nSe
ff70: 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20  tP2++] = addr;. 
ff80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ff90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ffa0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
ffb0: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
ffc0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
ffd0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
ffe0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52  .          p->pR
fff0: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
10000 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  hm = 1;.        
10010 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65  }.        create
10020 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
10030 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
10040 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10050 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10060 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10070 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
10080 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
10090 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
100a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
100b0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
100c0 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
100d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
100e0 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
100f0 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
10100 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10110 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10120 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
10130 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10140 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
10150 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10160 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10170 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10180 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10190 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
101a0 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
101b0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
101c0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
101d0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
101e0 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
101f0 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
10200 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
10210 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
10220 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
10230 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10240 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
10250 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
10260 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10270 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10280 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
10290 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  By = 0;.      p-
102a0 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
102b0 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a   = pOrderBy!=0;.
102c0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
102d0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
102e0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
102f0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
10300 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
10310 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
10320 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
10330 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
10340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10350 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
10360 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20   &uniondest, 0, 
10370 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
10380 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
10390 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
103a0 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
103b0 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
103c0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
103d0 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
103e0 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
103f0 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
10400 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
10410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10420 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
10430 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
10440 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
10450 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
10460 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
10470 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
10480 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
10490 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
104a0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
104b0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
104c0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
104d0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d     p->iLimit = -
104e0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  1;.      p->iOff
104f0 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  set = -1;.      
10500 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10510 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10520 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
10530 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
10540 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
10550 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10560 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
10570 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
10580 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
10590 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
105a0 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
105b0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
105c0 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
105d0 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61  ionTab!=dest.iPa
105e0 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
105f0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10600 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
10610 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10620 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
10630 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
10640 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
10650 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
10660 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
10670 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
10680 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
10690 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
106a0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
106b0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
106c0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
106d0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
106e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
106f0 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
10700 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10710 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
10720 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
10730 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10740 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
10750 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
10760 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
10770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10790 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
107a0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
107b0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
107c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
107d0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  dr(v);.        r
107e0 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
107f0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
10800 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
10810 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
10820 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
10850 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
10860 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
10870 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10880 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
10890 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
108a0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
108b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
108d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
108e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
108f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10900 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
10910 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
10920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10930 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10940 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10960 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
10970 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
10980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10990 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
109a0 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
109b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
109c0 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
109d0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
109e0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
109f0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
10a00 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
10a10 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
10a20 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
10a30 63 74 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 2f  ctdest;..      /
10a40 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
10a50 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
10a60 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
10a70 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
10a80 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
10a90 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
10aa0 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
10ab0 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
10ac0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
10ad0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
10ae0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
10af0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
10b00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10b10 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
10b20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10b30 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73        if( proces
10b40 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  sCompoundOrderBy
10b50 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31  (pParse, p, tab1
10b60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
10b70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
10b80 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10b90 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10ba0 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
10bb0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
10bc0 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20  pOrderBy);..    
10bd0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10bf0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10c00 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
10c10 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10c20 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
10c30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
10c40 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
10c50 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
10c60 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
10c70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
10c80 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
10c90 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
10ca0 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
10cb0 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
10cc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
10cd0 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
10ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10cf0 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
10d00 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
10d10 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
10d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10d30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10d40 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
10d50 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  tdest, 0, 0, 0, 
10d60 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
10d70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
10d80 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10d90 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
10da0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
10db0 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
10dc0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
10dd0 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
10de0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
10df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e00 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
10e10 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
10e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e30 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10e40 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
10e50 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
10e60 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
10e70 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
10e80 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
10e90 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
10ea0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
10eb0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
10ec0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
10ed0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10ee0 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
10ef0 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74  ctdest.iParm = t
10f00 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab2;.      rc = 
10f10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10f20 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
10f30 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
10f40 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
10f50 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
10f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10f70 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
10f80 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
10f90 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
10fa0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
10fb0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
10fc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10fd0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10fe0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
10ff0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
11000 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
11010 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
11020 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
11030 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
11040 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
11050 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11060 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
11070 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
11080 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
11090 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
110a0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
110b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
110c0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
110d0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
110e0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
110f0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
11100 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
11110 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
11120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11130 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11140 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11150 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
11160 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11170 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
11180 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
11190 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
111a0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
111b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
111c0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
111d0 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
111e0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
111f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11200 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
11210 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11230 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
11240 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
11250 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
11260 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11270 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
11280 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
11290 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
112c0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
112d0 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
112e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
112f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
11300 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11310 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11330 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11340 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
11350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11360 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
11370 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
11380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11390 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
113a0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
113b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
113c0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
113d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
113e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
113f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
11400 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11420 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
11430 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
11440 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
11450 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11460 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
11470 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
11480 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
11490 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
114a0 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
114b0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
114c0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
114d0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
114e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
114f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11500 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
11510 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
11520 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
11530 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
11540 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
11550 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
11560 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
11570 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
11580 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11590 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
115a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
115b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
115c0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
115d0 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
115e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
115f0 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
11600 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
11610 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
11620 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
11630 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
11640 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
11650 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
11660 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
11670 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11680 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
11690 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
116a0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
116b0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
116c0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
116d0 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
116e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
116f0 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
11700 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
11710 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
11720 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
11730 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
11740 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
11750 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
11760 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
11770 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11780 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
11790 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
117a0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
117b0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
117c0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
117d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
117e0 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
117f0 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
11800 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
11810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11820 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
11830 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
11840 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
11850 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
11860 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20  usesEphm ){.    
11870 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11890 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
118a0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
118b0 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
118c0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
118d0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
118e0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
118f0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
11900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11910 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11920 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
11930 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
11940 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11960 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
11970 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d  ies in pKeyInfo-
11980 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43  >aCol[] */.    C
11990 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
119c0 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
119d0 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  oll[] */.    Col
119e0 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20  lSeq **aCopy;   
119f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11a00 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f  copy of pKeyInfo
11a10 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20  ->aColl[] */..  
11a20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
11a30 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
11a40 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c    nKeyCol = nCol
11a50 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   + (pOrderBy ? p
11a60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
11a70 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66   0);.    pKeyInf
11a80 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
11a90 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
11aa0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
11ab0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11ac0 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65  f(*pKeyInfo)+nKe
11ad0 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  yCol*(sizeof(Col
11ae0 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
11af0 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
11b00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11b10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11b20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11b30 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
11b40 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
11b50 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
11b60 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
11b70 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
11b80 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
11b90 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
11ba0 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
11bb0 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
11bc0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
11bd0 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
11be0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
11bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
11c00 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
11c10 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72    *apColl = pPar
11c20 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11c30 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
11c40 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
11c50 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
11c60 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
11c70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11c80 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
11c90 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
11ca0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11cb0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
11cc0 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
11cd0 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
11ce0 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
11cf0 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
11d00 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
11d10 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
11d20 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
11d30 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
11d40 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
11d50 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
11d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
11d70 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11d80 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
11d90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11da0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
11db0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
11dc0 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
11dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11de0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
11df0 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
11e00 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11e10 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
11e20 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
11e30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
11e40 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
11e50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
11e60 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11e70 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
11e80 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
11e90 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
11ea0 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
11eb0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
11ec0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
11ed0 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
11ee0 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65      /* Reuse the
11ef0 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66   same pKeyInfo f
11f00 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
11f10 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76  as was used abov
11f20 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  e for.      ** t
11f30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11f40 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
11f50 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74  Except we have t
11f60 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65  o change out the
11f70 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e  .      ** pKeyIn
11f80 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  fo->aColl[] valu
11f90 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65  es.  Some of the
11fa0 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20   aColl[] values 
11fb0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
11fc0 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
11fd0 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b  structing the pK
11fe0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
11ff0 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65  RDER BY, so make
12000 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
12010 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70  .  Sufficient sp
12020 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ace to hold both
12030 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65   the nCol entrie
12040 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  s for.      ** t
12050 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
12060 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65  ct and the nOrde
12070 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20  rbyExpr entries 
12080 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
12090 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c  .      ** was al
120a0 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20  located above.  
120b0 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
120c0 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ove the compound
120d0 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a   select.      **
120e0 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20   entries out of 
120f0 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63  the way before c
12100 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
12110 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73  ORDER BY entries
12120 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  ..      ** Move 
12130 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12140 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  ect entries into
12150 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74   aCopy[] where t
12160 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hey can be.     
12170 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64   ** accessed and
12180 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
12190 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52  structing the OR
121a0 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a  DER BY entries..
121b0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
121c0 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67   nCol might be g
121d0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c  reater than or l
121e0 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42  ess than nOrderB
121f0 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77  yExpr.      ** w
12200 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65  e have to use me
12210 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69  mmove() when doi
12220 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  ng the copy..   
12230 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70     */.      aCop
12240 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  y = &pKeyInfo->a
12250 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70  Coll[nOrderByExp
12260 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f  r];.      pSortO
12270 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
12280 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12290 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b  8*)&aCopy[nCol];
122a0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61  .      memmove(a
122b0 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
122c0 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
122d0 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a  of(CollSeq*));..
122e0 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70        apColl = p
122f0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a  KeyInfo->aColl;.
12300 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12310 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69  <nOrderByExpr; i
12320 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70  ++, pOTerm++, ap
12330 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64  Coll++, pSortOrd
12340 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  er++){.        E
12350 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54  xpr *pExpr = pOT
12360 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
12370 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
12380 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
12390 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
123a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
123b0 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  r->pColl!=0 );. 
123c0 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
123d0 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
123e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
123f0 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
12400 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
12410 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
12420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
12430 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
12440 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
12450 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
12460 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
12470 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
12480 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
12490 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nEphm[2]>=0 );. 
124a0 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
124b0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a  ddrOpenEphm[2];.
124c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
124d0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
124e0 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  r, p->pOrderBy->
124f0 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20  nExpr+2);.      
12500 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
12510 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b   = nOrderByExpr;
12520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12530 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
12540 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
12550 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
12560 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
12570 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
12580 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
12590 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
125a0 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
125b0 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  xpr, &dest);.   
125c0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
125d0 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  free(pKeyInfo);.
125e0 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
125f0 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
12600 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d  iMem = dest.iMem
12610 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12620 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12630 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
12640 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
12650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12660 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  IEW./* Forward D
12670 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
12680 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
12690 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
126a0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
126b0 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
126c0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
126d0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
126e0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
126f0 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
12700 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
12710 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12720 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
12730 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
12740 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
12750 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
12760 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
12770 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
12780 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
12790 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
127a0 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
127b0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
127c0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
127d0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
127e0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
127f0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
12800 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
12810 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
12820 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
12830 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
12840 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
12850 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
12860 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
12870 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
12880 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
12890 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
128a0 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
128b0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
128c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
128d0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
128e0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
128f0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
12900 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
12910 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
12920 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
12930 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
12940 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
12950 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
12960 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
12970 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
12980 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
12990 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
129a0 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
129b0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
129c0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
129d0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
129e0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
129f0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
12a00 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
12a10 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12a20 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
12a30 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12a40 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12a50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
12a60 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
12a70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12a80 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
12a90 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
12aa0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
12ab0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
12ac0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12ad0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12ae0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
12af0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
12b00 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
12b10 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
12b20 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
12b30 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
12b40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b50 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
12b60 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
12b70 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
12b80 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
12b90 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
12ba0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
12bb0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
12bc0 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
12bd0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
12be0 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
12bf0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12c00 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
12c10 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
12c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
12c30 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
12c40 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12c50 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
12c60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12c70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
12c80 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12c90 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
12ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12cb0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
12cc0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12cd0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
12ce0 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
12cf0 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
12d00 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
12d10 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
12d20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
12d30 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
12d40 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
12d50 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
12d60 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
12d70 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
12d80 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
12d90 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
12da0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
12db0 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
12dc0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
12dd0 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
12de0 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
12df0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12e00 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
12e10 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
12e20 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
12e30 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
12e40 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
12e50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12e60 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12e70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12e80 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12e90 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
12ea0 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
12eb0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12ec0 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
12ed0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
12ee0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
12ef0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12f00 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
12f10 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
12f20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
12f30 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
12f40 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
12f50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12f60 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12f70 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
12f80 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
12f90 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
12fa0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
12fb0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
12fc0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
12fd0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
12fe0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12ff0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
13000 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13010 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13020 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13030 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13040 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13050 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
13060 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13070 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
13080 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
13090 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
130a0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
130b0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
130c0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
130d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
130e0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
130f0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
13100 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
13110 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
13120 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13130 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
13140 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
13150 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
13170 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
13180 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13190 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
131a0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
131b0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20   */.){.  if( !p 
131c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
131d0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
131e0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
131f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
13200 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13210 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
13220 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
13230 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
13240 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
13250 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13260 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
13270 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
13280 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
13290 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
132a0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
132b0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
132c0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
132d0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
132e0 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
132f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13300 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
13310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13320 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
13330 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
13340 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
13350 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
13360 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
13370 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
13380 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
13390 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
133a0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
133b0 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
133c0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
133d0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
133e0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
133f0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
13400 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
13410 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13420 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
13430 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
13440 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
13450 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
13460 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
13470 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
13480 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
13490 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
134a0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
134b0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
134c0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
134d0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
134e0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
134f0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
13500 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
13510 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
13520 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
13530 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
13540 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
13550 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13560 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
13570 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
13580 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
13590 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
135a0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
135b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
135c0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
135d0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
135e0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
135f0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
13600 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
13610 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13620 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
13630 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
13640 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
13650 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
13660 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
13670 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
13680 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
13690 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
136a0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
136b0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
136c0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
136d0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
136e0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
136f0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
13700 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
13710 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
13720 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
13730 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
13740 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
13750 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13760 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
13770 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
13780 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13790 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
137a0 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
137b0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
137c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
137d0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
137e0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
137f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13800 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
13810 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13820 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
13830 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
13840 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
13850 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
13860 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
13870 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
13880 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
13890 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
138a0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
138b0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
138c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
138d0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
138e0 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
138f0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
13900 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
13910 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13920 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
13930 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
13940 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
13950 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13960 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
13970 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
13980 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
13990 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
139a0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
139b0 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
139c0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
139d0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
139e0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
139f0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
13a00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13a10 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
13a20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
13a30 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
13a40 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13a50 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13a60 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
13a70 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
13a80 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
13a90 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
13aa0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
13ab0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13ac0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
13ad0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
13ae0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
13af0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13b00 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13b10 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
13b20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
13b30 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
13b40 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
13b50 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
13b60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13b70 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
13b80 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
13b90 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
13ba0 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
13bb0 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28  t #350).**.**  (
13bc0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
13bd0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
13be0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
13bf0 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
13c00 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
13c10 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
13c20 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
13c30 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
13c40 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
13c50 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
13c60 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
13c70 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
13c80 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
13c90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
13ca0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
13cb0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
13cc0 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
13cd0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
13ce0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
13cf0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
13d00 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
13d10 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
13d20 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
13d30 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
13d40 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13d50 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
13d60 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
13d70 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
13d80 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13d90 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
13da0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
13db0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
13dc0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
13dd0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
13de0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
13df0 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
13e00 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
13e10 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
13e20 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
13e30 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
13e40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
13e50 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
13e60 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
13e70 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
13e80 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
13e90 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
13ea0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
13eb0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
13ec0 75 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20  uery(.  sqlite3 
13ed0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
13ee0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13ef0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
13f00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
13f10 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
13f20 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
13f30 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
13f40 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
13f50 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
13f60 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
13f70 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
13f80 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
13f90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13fa0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
13fb0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
13fc0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
13fd0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
13fe0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
13ff0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
14000 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
14010 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
14020 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
14030 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
14040 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
14050 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
14060 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14070 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14080 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14090 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
140a0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
140b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
140c0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
140d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
140e0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
140f0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
14100 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
14110 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
14120 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
14130 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14140 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
14150 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
14160 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
14170 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14180 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
14190 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
141a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
141b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
141c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
141d0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
141e0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
141f0 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
14200 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
14210 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
14220 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
14230 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
14240 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
14250 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
14260 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
14270 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
14280 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
14290 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
142a0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
142b0 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
142c0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
142d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
142e0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
142f0 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
14300 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14330 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
14340 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
14350 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
14360 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14370 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14380 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
14390 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
143a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
143b0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
143c0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
143d0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
143e0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
143f0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
14400 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
14410 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
14420 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
14430 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
14440 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
14450 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
14460 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
14470 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
14480 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
14490 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
144a0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
144b0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
144c0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
144d0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
144e0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
144f0 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
14500 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
14510 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
14520 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14530 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14540 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
14550 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
14560 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14590 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
145a0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
145b0 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
145c0 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  mit && pSub->pOr
145d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
145e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14620 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
14630 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
14640 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14670 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
14680 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
14690 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c  inct || pSub->pL
146a0 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20  imit) .         
146b0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
146c0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20   || isAgg) ){   
146d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
146e0 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29  ctions (4)(5)(8)
146f0 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75  (9) */.     retu
14700 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d  rn 0;       .  }
14710 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
14720 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
14730 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
14740 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
14750 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
14760 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c  .  if( (p->disal
14770 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  lowOrderBy || p-
14780 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53  >pOrderBy) && pS
14790 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
147a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
147e0 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
147f0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
14800 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
14810 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
14820 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
14830 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
14840 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
14850 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
14860 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
14870 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
14880 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
14890 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
148a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
148b0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
148c0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
148d0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
148e0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
148f0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
14900 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
14910 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
14920 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
14930 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
14940 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
14950 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
14960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
14970 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
14980 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
14990 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
149a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
149b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
149c0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
149d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
149e0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
149f0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
14a00 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
14a10 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14a20 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
14a30 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
14a40 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
14a50 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
14a60 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
14a70 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
14a80 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
14a90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
14aa0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
14ab0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
14ac0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
14ad0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
14ae0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
14af0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
14b00 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
14b10 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
14b20 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
14b30 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
14b40 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
14b50 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
14b60 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
14b70 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
14b80 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
14b90 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
14ba0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
14bb0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
14bc0 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62  UTER)!=0 && pSub
14bd0 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
14be0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14bf0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
14c00 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
14c10 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
14c20 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
14c30 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
14c40 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
14c50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
14c60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
14c70 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
14c80 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
14c90 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
14ca0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
14cb0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
14cc0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
14cd0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
14ce0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
14cf0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
14d00 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14d10 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
14d20 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
14d30 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
14d40 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
14d50 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
14d60 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
14d70 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
14d80 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
14d90 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
14da0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
14db0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
14dc0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
14dd0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
14de0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
14df0 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
14e00 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
14e10 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
14e20 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
14e30 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
14e40 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
14e50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
14e60 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
14e70 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
14e80 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
14e90 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
14ea0 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73  jointype;..    s
14eb0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14ec0 65 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  e(pSubitem->pTab
14ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14ee0 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
14ef0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14f00 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
14f10 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
14f20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
14f30 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
14f40 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
14f50 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  Tab = 0;.    pSu
14f60 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
14f70 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
14f80 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
14f90 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c     pSubitem->zAl
14fa0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ias = 0;.    if(
14fb0 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
14fc0 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
14fd0 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
14fe0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
14ff0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
15000 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
15010 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15020 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29  (db, pSrc, 0, 0)
15030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
15040 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
15050 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
15060 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15070 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
15080 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15090 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
150a0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
150b0 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
150c0 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
150d0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
150e0 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
150f0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
15100 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15110 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
15120 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
15130 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
15140 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
15150 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
15160 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
15170 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
15180 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
15190 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
151a0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
151b0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
151c0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
151d0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
151e0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
151f0 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
15200 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
15210 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
15220 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
15230 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
15240 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
15250 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
15260 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
15270 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
15280 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
15290 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
152a0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
152b0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
152c0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
152d0 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
152e0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
152f0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
15300 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
15310 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15320 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
15330 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
15340 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
15350 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
15360 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
15370 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
15380 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
15390 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
153a0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
153b0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
153c0 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20  .  */.  pList = 
153d0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
153e0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
153f0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15400 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
15410 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
15420 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
15430 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
15440 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
15450 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
15460 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
15470 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
15480 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
15490 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
154a0 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d  ->span.z, pExpr-
154b0 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a  >span.n);.    }.
154c0 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c    }.  substExprL
154d0 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
154e0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
154f0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  ->pEList);.  if(
15500 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
15510 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15520 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  p->pGroupBy, iPa
15530 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15540 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
15550 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
15560 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
15570 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
15580 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
15590 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
155a0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
155b0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
155c0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
155d0 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
155e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
155f0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
15600 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
15610 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15620 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
15630 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15640 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
15650 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
15660 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
15670 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
15680 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
15690 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
156a0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
156b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
156c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
156d0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
156e0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
156f0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
15700 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
15710 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
15720 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
15730 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15740 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
15750 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
15760 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
15770 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
157a0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
157b0 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
157c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
157d0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
157e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
157f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
15800 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
15810 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
15820 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
15830 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72   p->pWhere, iPar
15840 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
15850 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
15860 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
15870 6e 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  nd(db, p->pWhere
15880 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a  , pWhere);.  }..
15890 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
158a0 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
158b0 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
158c0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
158d0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
158e0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
158f0 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
15900 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
15910 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
15920 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20  istinct;..  /*. 
15930 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
15940 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
15950 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
15960 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
15970 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e   y;.  **.  ** On
15980 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
15990 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
159a0 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
159b0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
159c0 68 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  his.  ** does no
159d0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
159e0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
159f0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ve..  */.  if( p
15a00 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
15a10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
15a20 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
15a30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
15a40 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  0;.  }..  /* Fin
15a50 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
15a60 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
15a70 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
15a80 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
15a90 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
15aa0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
15ab0 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
15ac0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15ad0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
15ae0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
15af0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15b00 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
15b10 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
15b20 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
15b30 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15b40 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 4f 52  query. Return OR
15b50 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 4f 52 44  DERBY_MIN or ORD
15b60 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
15b70 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
15b80 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
15b90 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
15ba0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
15bb0 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
15bc0 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
15bd0 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
15be0 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
15bf0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15c00 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
15c10 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
15c20 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
15c30 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
15c40 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
15c50 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
15c60 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
15c70 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
15c80 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
15c90 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
15ca0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15cb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
15cc0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
15cd0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
15ce0 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
15cf0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
15d00 3d 31 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45  =1 ) return ORDE
15d10 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
15d20 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
15d30 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69  0].pExpr;.  pELi
15d40 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
15d50 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
15d60 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
15d70 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ION || pEList==0
15d80 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
15d90 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
15da0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
15db0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
15dc0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
15dd0 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15de0 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70  RMAL;.  if( pExp
15df0 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
15e00 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e  return ORDERBY_N
15e10 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c  ORMAL;.  if( sql
15e20 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
15e30 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
15e40 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
15e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44  {.    return ORD
15e60 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
15e70 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
15e80 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
15e90 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
15ea0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
15eb0 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 41  eturn ORDERBY_MA
15ec0 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
15ed0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
15ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
15ef0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15f00 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
15f10 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
15f20 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
15f30 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
15f40 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
15f50 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
15f60 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
15f70 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
15f80 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
15f90 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
15fa0 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
15fb0 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
15fc0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
15fd0 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
15fe0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
15ff0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
16000 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
16010 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
16020 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
16030 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
16040 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
16050 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
16060 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
16070 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
16080 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
16090 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
160a0 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
160b0 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
160c0 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
160d0 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
160e0 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
160f0 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
16100 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
16110 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
16120 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
16130 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
16140 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
16150 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
16160 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
16170 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
16180 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
16190 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
161a0 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
161b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
161c0 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
161d0 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
161e0 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
161f0 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  te3Select()..** 
16200 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
16210 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
16220 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
16230 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
16240 6e 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74  n..*/.#if 0.stat
16250 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
16260 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
16270 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16280 70 2c 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  p, SelectDest *p
16290 44 65 73 74 29 7b 0a 20 20 45 78 70 72 20 2a 70  Dest){.  Expr *p
162a0 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
162b0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
162c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
162d0 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
162e0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
162f0 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  kOp;.  ExprList 
16300 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c  *pEList, *pList,
16310 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74   eList;.  struct
16320 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65   ExprList_item e
16330 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c  ListItem;.  SrcL
16340 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74  ist *pSrc;.  int
16350 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b   brk;.  int iDb;
16360 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
16370 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
16380 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
16390 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
163a0 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
163b0 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
163c0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
163d0 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
163e0 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
163f0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
16400 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
16410 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  Src;.  if( pSrc-
16420 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
16430 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
16440 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
16450 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
16460 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
16470 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
16480 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
16490 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
164a0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
164b0 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74  eturn 0;.  pList
164c0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
164d0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
164e0 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  || pList->nExpr!
164f0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
16500 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
16510 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
16520 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
16530 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
16540 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
16550 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
16560 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
16570 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
16580 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
16590 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
165a0 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
165b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
165c0 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d  p = OP_Last;.  }
165d0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
165e0 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20   0;.  }.  pExpr 
165f0 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
16600 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
16610 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
16620 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
16630 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
16640 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  umn;.  pTab = pS
16650 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
16660 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    /* This optimi
16670 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
16680 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74 75   used with virtu
16690 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  al tables. */.  
166a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
166b0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
166c0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
166d0 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e  to here, it mean
166e0 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  s the query is o
166f0 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f  f the correct fo
16700 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74  rm..  ** Check t
16710 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  o make sure we h
16720 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ave an index and
16730 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74   make pIdx point
16740 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70   to the.  ** app
16750 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20  ropriate index. 
16760 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   If the min() or
16770 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20   max() is on an 
16780 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a  INTEGER PRIMARY.
16790 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c    ** key column,
167a0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63   no index is nec
167b0 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49  essary so set pI
167c0 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  dx to NULL.  If 
167d0 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69  no.  ** usable i
167e0 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72  ndex is found, r
167f0 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
16800 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
16810 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65    pIdx = 0;.  }e
16820 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  lse{.    CollSeq
16830 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
16840 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16850 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
16860 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
16870 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
16880 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
16890 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
168a0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
168b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
168c0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
168d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
168e0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
168f0 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  l && .          
16900 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
16910 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  p(pIdx->azColl[0
16920 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
16930 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16940 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16950 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
16960 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
16970 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
16980 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
16990 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
169a0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
169b0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
169c0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
169d0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
169e0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
169f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
16a00 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
16a10 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
16a20 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
16a30 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
16a40 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
16a50 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16a60 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16a70 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
16a80 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
16a90 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
16aa0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
16ab0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
16ac0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
16ad0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
16ae0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
16af0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16b10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
16b20 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b  Dest->iParm, 1);
16b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16b40 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
16b50 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
16b60 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
16b70 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
16b80 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
16b90 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
16ba0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
16bb0 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
16bc0 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
16bd0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
16be0 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
16bf0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
16c00 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
16c10 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
16c20 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
16c30 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44  table..  */.  iD
16c40 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16c50 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
16c60 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
16c70 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
16c80 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69  Db>=0 || pTab->i
16c90 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69  sEphem );.  sqli
16ca0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
16cb0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
16cc0 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
16cd0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
16ce0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
16cf0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
16d00 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b   base = pSrc->a[
16d10 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72  0].iCursor;.  br
16d20 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
16d30 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
16d40 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
16d50 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
16d60 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63  brk);.  if( pSrc
16d70 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
16d80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16d90 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
16da0 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61  , base, iDb, pTa
16db0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
16dc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d  .  }.  if( pIdx=
16dd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16de0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73  3VdbeAddOp2(v, s
16df0 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
16e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16e10 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   Even though the
16e20 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
16e30 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68  open the index h
16e40 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ere is closed.  
16e50 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20    ** as soon as 
16e60 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68  a single value h
16e70 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f  as been read fro
16e80 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69  m it, allocate i
16e90 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28  t.    ** using (
16ea0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20  pParse->nTab++) 
16eb0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 63  to prevent the c
16ec0 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65  ursor id from be
16ed0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73  ing .    ** reus
16ee0 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f  ed. This is impo
16ef0 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d  rtant for statem
16f00 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
16f10 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54   .    ** "INSERT
16f20 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d   INTO x SELECT m
16f30 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20  ax() FROM x"..  
16f40 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64    */.    int iId
16f50 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  x;.    KeyInfo *
16f60 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
16f70 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
16f80 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49  e, pIdx);.    iI
16f90 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
16fa0 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b++;.    assert(
16fb0 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
16fc0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
16fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16fe0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
16ff0 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64  nRead, iIdx, pId
17000 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
17010 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
17020 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
17030 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20  NDOFF);.    if( 
17040 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
17050 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
17060 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17070 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
17080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17090 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61  eAddOp2(v, OP_Ma
170a0 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
170b0 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
170c0 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
170d0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
170e0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 53 51  SortOrder[0]==SQ
170f0 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 7b 0a  LITE_SO_DESC ){.
17100 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
17110 23 32 35 31 34 3a 20 69 6e 76 65 72 74 20 74 68  #2514: invert th
17120 65 20 73 65 65 6b 20 6f 70 65 72 61 74 6f 72 20  e seek operator 
17130 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 0a  if we are using.
17140 20 20 20 20 20 20 2a 2a 20 61 20 64 65 73 63 65        ** a desce
17150 6e 64 69 6e 67 20 69 6e 64 65 78 2e 20 2a 2f 0a  nding index. */.
17160 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70        if( seekOp
17170 3d 3d 4f 50 5f 4c 61 73 74 20 29 7b 0a 20 20 20  ==OP_Last ){.   
17180 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50       seekOp = OP
17190 5f 52 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 7d  _Rewind;.      }
171a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
171b0 73 65 72 74 28 20 73 65 65 6b 4f 70 3d 3d 4f 50  sert( seekOp==OP
171c0 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20  _MoveGt );.     
171d0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
171e0 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  oveLt;.      }. 
171f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73 65  VdbeAddOp2(v, se
17210 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ekOp, iIdx, 0);.
17220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17230 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
17240 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a  owid, iIdx, 0);.
17250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17270 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  e, iIdx, 0);.   
17280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17290 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  p2(v, OP_MoveGe,
172a0 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20   base, 0);.  }. 
172b0 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31   eList.nExpr = 1
172c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73  ;.  memset(&eLis
172d0 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  tItem, 0, sizeof
172e0 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20  (eListItem));.  
172f0 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74  eList.a = &eList
17300 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b  Item;.  eList.a[
17310 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
17320 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
17330 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
17340 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  eList, 0, 0, 0, 
17350 2d 31 2c 20 70 44 65 73 74 2c 20 62 72 6b 2c 20  -1, pDest, brk, 
17360 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
17370 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17380 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
17390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
173a0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
173b0 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75  e, 0);.  .  retu
173c0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 0a  rn 1;.}.#endif .
173d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
173e0 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79  ine resolves any
173f0 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74   names used in t
17400 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
17410 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64   the.** supplied
17420 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17430 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  t. If the SELECT
17440 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
17450 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20   resolved.** is 
17460 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68  a sub-select, th
17470 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61  en pOuterNC is a
17480 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17490 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20  NameContext .** 
174a0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45  of the parent SE
174b0 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LECT..*/.int sql
174c0 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
174d0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
174e0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
174f0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
17500 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
17510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17520 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
17530 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
17540 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
17550 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
17560 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65  * The outer name
17570 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65   context. May be
17580 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45   NULL. */.){.  E
17590 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
175a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
175b0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e  ult set. */.  in
175c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
175d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d           /* For-
175e0 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73  loop variable us
175f0 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ed in multiple p
17600 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43  laces */.  NameC
17610 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
17620 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e        /* Local n
17630 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame-context */. 
17640 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
17650 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBy;        /* T
17660 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
17670 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  se */..  /* If t
17680 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
17690 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75  run before, retu
176a0 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
176b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  */.  if( p->isRe
176c0 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73  solved ){.    as
176d0 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20  sert( !pOuterNC 
176e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
176f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
17700 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31  ->isResolved = 1
17710 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
17720 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
17730 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f  en errors, do no
17740 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  thing. */.  if( 
17750 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17770 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17780 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
17790 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
177a0 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c  t. This call wil
177b0 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63  l allocate all c
177c0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75  ursors.  ** requ
177d0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
177e0 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75  he tables and su
177f0 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
17800 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
17810 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  /.  if( prepSele
17820 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
17830 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17840 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17850 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
17860 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
17870 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  in the LIMIT and
17880 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
17890 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20   These.  ** are 
178a0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72  not allowed to r
178b0 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65  efer to any name
178c0 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d  s, so pass an em
178d0 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e  pty NameContext.
178e0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
178f0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
17900 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72  NC));.  sNC.pPar
17910 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
17920 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
17930 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
17940 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20   p->pLimit) ||. 
17950 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17960 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
17970 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  C, p->pOffset) )
17980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17990 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
179a0 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
179b0 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  local name-conte
179c0 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78  xt to pass to Ex
179d0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
179e0 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65   to.  ** resolve
179f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d   the expression-
17a00 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  list..  */.  sNC
17a10 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  .allowAgg = 1;. 
17a20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
17a30 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70  p->pSrc;.  sNC.p
17a40 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b  Next = pOuterNC;
17a50 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  ..  /* Resolve n
17a60 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
17a70 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c  lt set. */.  pEL
17a80 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
17a90 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20 29  .  if( !pEList )
17aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17ab0 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  RROR;.  for(i=0;
17ac0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
17ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
17ae0 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
17af0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
17b00 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
17b10 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
17b20 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pX) ){.      re
17b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17b40 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
17b50 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17b60 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
17b70 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65  ctions in the re
17b80 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f  sult-set, and no
17b90 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20   GROUP BY .  ** 
17ba0 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
17bb0 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
17bc0 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
17bd0 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
17be0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
17bf0 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b  rt( !p->isAgg );
17c00 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
17c10 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28  >pGroupBy;.  if(
17c20 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43   pGroupBy || sNC
17c30 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  .hasAgg ){.    p
17c40 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  ->isAgg = 1;.  }
17c50 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c  else{.    sNC.al
17c60 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  lowAgg = 0;.  }.
17c70 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e  .  /* If a HAVIN
17c80 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  G clause is pres
17c90 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ent, then there 
17ca0 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20  must be a GROUP 
17cb0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  BY clause..  */.
17cc0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
17cd0 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
17ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17cf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
17d00 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
17d10 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
17d20 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
17d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17d40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
17d50 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73 69  Add the expressi
17d60 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e  on list to the n
17d70 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f  ame-context befo
17d80 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20  re parsing the. 
17d90 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73   ** other expres
17da0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  sions in the SEL
17db0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
17dc0 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20  his is so that. 
17dd0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
17de0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
17df0 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72  use (etc.) can r
17e00 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69  efer to expressi
17e10 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61  ons by.  ** alia
17e20 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
17e30 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  t set..  **.  **
17e40 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66   Minor point: If
17e50 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
17e60 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  e, then the expr
17e70 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  ession will be. 
17e80 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64   ** re-evaluated
17e90 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65   for each refere
17ea0 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  nce to it..  */.
17eb0 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70    sNC.pEList = p
17ec0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
17ed0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
17ee0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
17ef0 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20  >pWhere) ||.    
17f00 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
17f10 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
17f20 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  ->pHaving) ){.  
17f30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17f50 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
17f60 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73  .    if( process
17f70 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
17f80 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
17f90 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73  rBy, 1, &sNC.has
17fa0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Agg) ){.      re
17fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17fc0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
17fd0 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  f( processOrderG
17fe0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
17ff0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26  , pGroupBy, 0, &
18000 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20  sNC.hasAgg) ){. 
18010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18020 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
18030 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
18040 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18050 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18060 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
18070 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
18080 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
18090 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
180a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
180b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
180c0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
180d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
180e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
180f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
18100 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
18110 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
18120 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
18130 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  ){.      if( Exp
18140 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74  rHasProperty(pIt
18150 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67  em->pExpr, EP_Ag
18160 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  g) ){.        sq
18170 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18180 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65  arse, "aggregate
18190 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e   functions are n
181a0 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a  ot allowed in ".
181b0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
181c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
181d0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
181e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
181f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18200 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
18210 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f   is one SELECT o
18220 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65  f a compound, be
18230 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65   sure to resolve
18240 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74   names.  ** in t
18250 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73  he other SELECTs
18260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18270 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
18280 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  turn sqlite3Sele
18290 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
182a0 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75  , p->pPrior, pOu
182b0 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  terNC);.  }else{
182c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
182d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
182e0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
182f0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
18300 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
18310 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
18320 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
18330 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
18340 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
18350 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
18360 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
18370 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
18380 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
18390 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
183a0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
183b0 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
183c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
183d0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
183e0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
183f0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
18400 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
18410 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18420 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
18430 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
18440 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
18450 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
18460 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
18470 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18480 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
18490 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
184a0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
184b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
184c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
184d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
184e0 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
184f0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
18500 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
18510 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
18520 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
18530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18540 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
18550 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
18560 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
18570 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
18580 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
18590 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
185a0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
185b0 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
185c0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
185d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
185e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
185f0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
18600 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
18610 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
18620 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
18630 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
18640 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
18650 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
18660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18670 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18680 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
18690 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
186a0 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
186b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
186c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
186d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
186e0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
186f0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18710 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
18720 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
18730 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
18740 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18750 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
18760 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
18770 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
18780 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
18790 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
187a0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
187b0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
187c0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
187d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
187e0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
187f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
18800 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
18810 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
18820 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
18830 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
18840 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
18850 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
18860 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
18870 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
18880 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
18890 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
188a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
188b0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
188c0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
188d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
188e0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
188f0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
18900 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
18910 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
18920 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
18930 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
18940 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
18950 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
18960 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
18970 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
18980 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18990 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
189a0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
189b0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
189c0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
189d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
189e0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
189f0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
18a00 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
18a10 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
18a20 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
18a30 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
18a40 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
18a50 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
18a60 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
18a70 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
18a80 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
18a90 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
18aa0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
18ab0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
18ac0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  >pList;.    if( 
18ad0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
18ae0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
18af0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
18b00 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
18b10 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
18b20 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18b30 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
18b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
18b50 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
18b60 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
18b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18b80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18b90 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
18ba0 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
18bb0 69 73 74 69 6e 63 74 5f 4f 4c 44 28 76 2c 20 70  istinct_OLD(v, p
18bc0 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
18bd0 64 72 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  drNext, 1);.    
18be0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
18bf0 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
18c00 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
18c10 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
18c20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18c30 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18c40 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
18c50 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
18c60 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
18c70 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
18c80 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69  c->needCollSeq i
18c90 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
18ca0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
18cb0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
18cc0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
18cd0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18ce0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
18cf0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
18d00 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
18d10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18d20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
18d30 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
18d40 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
18d50 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
18d80 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
18d90 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
18da0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
18db0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18dc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
18dd0 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  Step, pF->iMem, 
18de0 6e 41 72 67 2c 20 30 2c 20 0a 20 20 20 20 20 20  nArg, 0, .      
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
18e10 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
18e20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
18e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18e40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18e50 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
18e60 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
18e70 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
18e80 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
18e90 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
18ea0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
18eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18ec0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
18ed0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
18ee0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
18ef0 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
18f00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18f10 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a  _OMIT_TRIGGER./*
18f20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18f30 6e 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  n is used when a
18f40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18f50 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  t is used to cre
18f60 61 74 65 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61  ate a.** tempora
18f70 72 79 20 74 61 62 6c 65 20 66 6f 72 20 69 74 65  ry table for ite
18f80 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 77  rating through w
18f90 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49  hen running an I
18fa0 4e 53 54 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44  NSTEAD OF.** UPD
18fb0 41 54 45 20 6f 72 20 49 4e 53 54 45 41 44 20 4f  ATE or INSTEAD O
18fc0 46 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72  F DELETE trigger
18fd0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  . .**.** If poss
18fe0 69 62 6c 65 2c 20 74 68 65 20 53 45 4c 45 43 54  ible, the SELECT
18ff0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f   statement is mo
19000 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 4e  dified so that N
19010 55 4c 4c 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  ULL values.** ar
19020 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
19030 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
19040 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
19050 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 2a  for which the .*
19060 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
19070 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
19080 6d 61 73 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e  mask is not set.
19090 20 49 66 20 6d 61 73 6b 20 74 61 6b 65 73 20 74   If mask takes t
190a0 68 65 0a 2a 2a 20 73 70 65 63 69 61 6c 20 76 61  he.** special va
190b0 6c 75 65 20 30 78 66 66 66 66 66 66 66 66 2c 20  lue 0xffffffff, 
190c0 74 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  then all columns
190d0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a   are populated..
190e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
190f0 6c 65 63 74 4d 61 73 6b 28 50 61 72 73 65 20 2a  lectMask(Parse *
19100 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
19110 70 2c 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20 20  p, u32 mask){.  
19120 69 66 28 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  if( !p->pPrior &
19130 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  & !p->isDistinct
19140 20 26 26 20 6d 61 73 6b 21 3d 30 78 66 66 66 66   && mask!=0xffff
19150 66 66 66 66 20 29 7b 0a 20 20 20 20 45 78 70 72  ffff ){.    Expr
19160 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
19170 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
19180 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
19190 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
191a0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
191b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
191c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 4c 69  ;.    }.    pELi
191d0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
191e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
191f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  EList->nExpr && 
19200 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
19210 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75    if( !(mask&((u
19220 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20  32)1<<i)) ){.   
19230 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19240 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61  Delete(pEList->a
19250 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
19260 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d      pEList->a[i]
19270 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
19280 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
19290 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
192a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
192b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
192c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
192d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
192e0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
192f0 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
19300 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
19310 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
19320 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
19330 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
19340 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
19350 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
19360 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
19370 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
19380 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
19390 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
193a0 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
193b0 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
193c0 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
193d0 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
193e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19400 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
19410 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
19420 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
19430 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
19440 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
19450 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
19460 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
19470 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
19480 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
19490 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
194a0 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
194b0 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 65 73 75  re non-null resu
194c0 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74  lts as keys of t
194d0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
194e0 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
194f0 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
19500 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
19510 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65  est->affinity be
19520 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68 65  fore storing the
19530 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
19540 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
19550 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
19560 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
19570 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
19580 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
19590 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
195a0 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
195b0 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
195c0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
195d0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
195e0 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
195f0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
19600 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
19610 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a  e pDest->iParm.*
19620 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68  *.**     SRT_Eph
19630 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20  emTab    Create 
19640 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  an temporary tab
19650 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  le pDest->iParm 
19660 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20  and store.**    
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72   the result ther
19690 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  e. The cursor is
196a0 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72   left open after
196b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
196c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e          returnin
196d0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  g..**.**     SRT
196e0 5f 53 75 62 72 6f 75 74 69 6e 65 20 20 46 6f 72  _Subroutine  For
196f0 20 65 61 63 68 20 72 6f 77 20 72 65 74 75 72 6e   each row return
19700 65 64 2c 20 70 75 73 68 20 74 68 65 20 72 65 73  ed, push the res
19710 75 6c 74 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a  ults onto the.**
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 76 64 62 65 20 73 74 61 63 6b 20       vdbe stack 
19740 61 6e 64 20 63 61 6c 6c 20 74 68 65 20 73 75 62  and call the sub
19750 72 6f 75 74 69 6e 65 20 28 76 69 61 20 4f 50 5f  routine (via OP_
19760 47 6f 73 75 62 29 0a 2a 2a 20 20 20 20 20 20 20  Gosub).**       
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
19780 20 61 64 64 72 65 73 73 20 70 44 65 73 74 2d 3e   address pDest->
19790 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
197a0 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
197b0 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
197c0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
197d0 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65  >iParm if the re
197e0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
197f0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
19800 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a  is not empty..**
19810 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63  .**     SRT_Disc
19820 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68  ard     Throw th
19830 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 0a  e results away..
19840 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
19850 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
19860 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20 63  function for a c
19870 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67  anonical listing
19880 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   of the .** allo
19890 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
198a0 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
198b0 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
198c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
198d0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
198e0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
198f0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
19900 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
19910 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
19920 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
19930 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
19940 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
19950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19960 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
19970 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
19980 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
19990 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
199a0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
199b0 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
199c0 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
199d0 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
199e0 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
199f0 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
19a00 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
19a10 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
19a20 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
19a30 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
19a40 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
19a50 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
19a60 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
19a70 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
19a80 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
19a90 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
19aa0 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
19ab0 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
19ac0 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
19ad0 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
19ae0 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
19af0 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
19b00 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
19b10 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
19b20 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
19b30 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
19b40 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
19b50 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
19b60 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
19b70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
19b80 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
19b90 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
19ba0 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
19bb0 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
19bd0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
19be0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
19bf0 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
19c30 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
19c40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
19c50 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
19c60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
19c70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19c80 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
19c90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19ca0 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
19cb0 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
19cc0 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
19cd0 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
19ce0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
19cf0 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
19d00 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
19d10 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
19d20 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
19d30 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
19d40 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
19d50 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
19d60 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
19d70 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
19d80 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
19d90 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
19da0 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
19db0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
19dc0 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
19dd0 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
19de0 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
19df0 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
19e00 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
19e10 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
19e20 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
19e30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
19e40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
19e50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
19e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19e70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19e80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
19e90 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
19ea0 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 2f  st *pDest,     /
19eb0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
19ec0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
19ed0 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  lts */.  Select 
19ee0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
19ef0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
19f00 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
19f10 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
19f20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
19f30 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
19f40 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
19f50 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
19f60 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
19f70 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
19f80 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
19f90 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
19fa0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
19fb0 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
19fc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
19fd0 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
19fe0 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
19ff0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
1a000 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
1a010 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a020 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
1a030 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1a040 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
1a050 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1a060 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
1a070 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1a080 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1a090 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
1a0a0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a0b0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
1a0c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a0d0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
1a0e0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
1a0f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1a100 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
1a110 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
1a120 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
1a130 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1a140 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
1a150 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
1a160 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
1a170 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1a180 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1a190 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1a1a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1a1b0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
1a1c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1a1d0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1a1e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1a1f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
1a200 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
1a210 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1a220 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1a230 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
1a240 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
1a250 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
1a260 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1a270 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
1a280 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1a290 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
1a2a0 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
1a2b0 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
1a2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1a2d0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
1a2e0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
1a2f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
1a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a310 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
1a320 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
1a330 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
1a340 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
1a350 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
1a360 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
1a370 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a380 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
1a390 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
1a3a0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
1a3b0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1a3c0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a3e0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
1a3f0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
1a400 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1a410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a420 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a430 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
1a440 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1a450 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
1a460 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1a470 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1a480 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1a490 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1a4a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a4b0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1a4c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a4d0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
1a4e0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
1a4f0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
1a500 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1a510 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49  OrderBy;.  if( I
1a520 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1a530 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d  pDest) ){.    p-
1a540 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
1a550 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20      /* In these 
1a560 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e  cases the DISTIN
1a570 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65  CT operator make
1a580 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
1a590 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  to the.    ** re
1a5a0 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65  sults, so remove
1a5b0 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73   it if it were s
1a5c0 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
1a5d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
1a5e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1a5f0 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
1a600 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
1a610 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
1a620 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1a630 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
1a640 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
1a650 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73  card);.    p->is
1a660 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1a670 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
1a680 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
1a690 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20  rse, p, 0) ){.  
1a6a0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1a6b0 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64  d;.  }.  p->pOrd
1a6c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1a6d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a6e0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1a6f0 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
1a700 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
1a710 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
1a720 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
1a730 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
1a740 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1a750 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
1a760 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
1a770 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1a780 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20  Loop, *pRight = 
1a790 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  0;.      int cnt
1a7a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
1a7b0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
1a7c0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
1a7d0 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
1a7e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
1a7f0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
1a800 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
1a810 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1a820 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
1a830 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1a840 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f   if( SQLITE_MAX_
1a850 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3e  COMPOUND_SELECT>
1a860 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45 5f  0 && cnt>SQLITE_
1a870 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
1a880 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
1a890 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a8a0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1a8b0 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
1a8c0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
1a8d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a8e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a8f0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
1a900 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
1a910 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Dest, aff);.  }.
1a920 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
1a930 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
1a940 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
1a950 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
1a960 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
1a970 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
1a980 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
1a990 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
1a9a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
1a9b0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
1a9c0 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d  ng;.  isAgg = p-
1a9d0 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74  >isAgg;.  isDist
1a9e0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
1a9f0 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d  inct;.  pEList =
1aa00 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1aa10 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
1aa20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1aa30 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
1aa40 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
1aa50 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
1aa60 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
1aa70 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
1aa80 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
1aa90 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1aaa0 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
1aab0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
1aac0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1aad0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
1aae0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
1aaf0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
1ab00 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
1ab10 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
1ab20 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
1ab30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ab40 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
1ab50 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
1ab60 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
1ab70 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
1ab80 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
1ab90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1aba0 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
1abb0 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
1abc0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
1abd0 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
1abe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e  ..  */.  if( Ign
1abf0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1ac00 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  est) ){.    pOrd
1ac10 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
1ac20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
1ac30 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
1ac40 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1ac50 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1ac60 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1ac70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1ac80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ac90 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
1aca0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
1acb0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
1acc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1acd0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1ace0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1acf0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
1ad00 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1ad10 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1ad20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ad30 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1ad40 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
1ad50 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
1ad60 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  t;.    struct Sr
1ad70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ad80 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1ad90 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1ada0 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20 20 69  est dest;..    i
1adb0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1adc0 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  t==0 || pItem->i
1add0 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
1ade0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1adf0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  Item->zName!=0 )
1ae00 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
1ae10 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1ae20 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1ae30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1ae40 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1ae50 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
1ae60 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
1ae70 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
1ae80 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
1ae90 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
1aea0 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65   0;.    }.#if de
1aeb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1aec0 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  T) || SQLITE_MAX
1aed0 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
1aee0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1aef0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1af00 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1af10 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1af20 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1af30 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1af40 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1af50 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1af60 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1af70 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1af80 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1af90 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1afa0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1afb0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1afc0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1afd0 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1afe0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1aff0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1b000 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1b010 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1b020 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1b030 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1b040 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1b050 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1b060 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1b070 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  p);.#endif.    s
1b080 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1b090 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
1b0a0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
1b0b0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  >iCursor);.    s
1b0c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1b0d0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1b0e0 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c 20 69  ect, &dest, p, i
1b0f0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
1b100 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b110 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1b120 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b130 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
1b140 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1b150 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
1b160 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
1b170 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1b180 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1b190 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65  xprHeight(p);.#e
1b1a0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65  ndif.    if( nee
1b1b0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
1b1c0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1b1d0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1b1e0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1b1f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
1b200 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1b210 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
1b220 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
1b230 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
1b240 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1b250 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
1b260 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
1b270 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1b280 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1b290 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1b2a0 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
1b2b0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1b2c0 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
1b2d0 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  f..  /* Check fo
1b2e0 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
1b2f0 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
1b300 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
1b310 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
1b320 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1b330 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69  ..  */.#if 0.  i
1b340 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
1b350 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
1b360 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 72 63  pDest) ){.    rc
1b370 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 0;.    goto s
1b380 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1b390 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
1b3a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
1b3b0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
1b3c0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
1b3d0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
1b3e0 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
1b3f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
1b400 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
1b410 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
1b420 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
1b430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b440 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
1b450 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
1b460 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
1b470 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 64  lattenSubquery(d
1b480 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  b, pParent, pare
1b490 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
1b4a0 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
1b4b0 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
1b4c0 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
1b4d0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1b4e0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
1b4f0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
1b500 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75  , rewrite the qu
1b510 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50  ery to use GROUP
1b520 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44   BY instead of D
1b530 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52  ISTINCT..  ** GR
1b540 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65 20 61  OUP BY may use a
1b550 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43  n index, DISTINC
1b560 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20  T never does..  
1b570 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69  */.  if( p->isDi
1b580 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69 73  stinct && !p->is
1b590 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  Agg && !p->pGrou
1b5a0 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  pBy ){.    p->pG
1b5b0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1b5c0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1b5d0 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1b5e0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1b5f0 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 69  roupBy;.    p->i
1b600 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1b610 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
1b620 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1b630 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1b640 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1b650 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
1b660 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
1b670 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
1b680 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
1b690 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
1b6a0 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
1b6b0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
1b6c0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
1b6d0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1b6e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1b6f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
1b700 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
1b710 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
1b720 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
1b730 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
1b740 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
1b750 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
1b760 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
1b770 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
1b780 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
1b790 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
1b7a0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1b7b0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1b7c0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  *pKeyInfo;.    i
1b7d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1b7e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1b7f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1b800 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1b810 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1b820 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1b830 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1b840 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1b850 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1b860 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1b870 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1b880 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1b890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b8a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1b8b0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1b8e0 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1b8f0 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1b920 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1b930 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1b940 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1b950 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1b960 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1b970 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1b980 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1b990 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1b9a0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1b9b0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1b9c0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1b9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b9e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1b9f0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1ba00 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1ba10 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1ba20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1ba30 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1ba40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ba50 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1ba60 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1ba70 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1ba80 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1ba90 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1baa0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1bab0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1bac0 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1bad0 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1bae0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1baf0 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1bb00 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1bb10 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1bb20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1bb30 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1bb40 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1bb50 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1bb60 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1bb70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1bb80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1bb90 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1bbc0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1bbd0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1bbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1bbf0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1bc00 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1bc10 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1bc20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1bc30 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1bc40 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1bc50 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1bc60 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1bc70 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1bc80 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1bc90 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1bca0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1bcb0 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1bcc0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1bcd0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1bce0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1bcf0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
1bd00 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1bd10 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1bd20 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1bd30 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1bd40 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1bd50 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1bd60 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1bd70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1bd80 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1bd90 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1bda0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1bdb0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
1bdc0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
1bdd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bde0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
1bdf0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
1be00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1be10 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1be20 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
1be30 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
1be40 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1be50 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
1be60 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
1be70 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
1be80 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1be90 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
1bea0 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
1beb0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1bec0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1bed0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1bee0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1bef0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1bf00 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1bf10 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
1bf20 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
1bf30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1bf40 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   }..    /* End t
1bf50 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1bf60 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
1bf70 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1bf80 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
1bf90 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1bfa0 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
1bfb0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1bfc0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
1bfd0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1bfe0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
1bff0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
1c000 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
1c010 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
1c020 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
1c030 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1c040 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
1c050 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
1c060 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1c070 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
1c080 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1c090 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
1c0a0 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
1c0b0 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
1c0c0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
1c0d0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
1c0e0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
1c0f0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
1c120 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
1c130 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
1c140 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1c160 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1c170 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
1c180 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
1c190 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
1c1a0 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
1c1b0 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
1c1c0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
1c1d0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
1c1e0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
1c1f0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
1c200 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  */...    /* The 
1c210 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1c220 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73  les hold address
1c230 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72  es or labels for
1c240 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20   parts of the.  
1c250 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
1c260 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20  hine program we 
1c270 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65  are putting toge
1c280 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ther */.    int 
1c290 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
1c2a0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1c2b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1c2c0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
1c2d0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
1c2e0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
1c2f0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61      /* Set the a
1c300 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
1c310 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  turn */.    int 
1c320 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1c330 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  op; /* Start of 
1c340 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1c350 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20  lizes the input 
1c360 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
1c370 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
1c380 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1c390 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
1c3a0 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75      int addrGrou
1c3b0 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43  pByChange;  /* C
1c3c0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
1c3d0 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  en any GROUP BY 
1c3e0 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a  term changes */.
1c3f0 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63      int addrProc
1c400 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43  essRow;     /* C
1c410 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ode to process a
1c420 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f   single input ro
1c430 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
1c440 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  rEnd;           
1c450 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70   /* End of all p
1c460 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20  rocessing */.   
1c470 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
1c480 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
1c490 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1c4a0 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
1c4b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1c4c0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
1c4d0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
1c4e0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
1c4f0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
1c500 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  r */..    addrEn
1c510 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1c520 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1c530 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
1c540 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
1c550 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
1c560 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
1c570 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
1c580 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
1c590 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
1c5a0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
1c5b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
1c5c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c5d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
1c5e0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
1c5f0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
1c600 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
1c610 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
1c620 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
1c630 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
1c640 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
1c650 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
1c660 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
1c670 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
1c680 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
1c690 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
1c6a0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
1c6b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c6c0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c6d0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
1c6e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1c6f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1c700 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c710 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c720 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
1c730 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1c740 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1c750 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
1c760 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
1c770 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1c780 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
1c790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1c7a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1c7b0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
1c7c0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
1c7d0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
1c7e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1c7f0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
1c800 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1c810 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1c820 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
1c830 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
1c840 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
1c850 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
1c860 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1c870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c880 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c890 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1c8a0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
1c8b0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1c8c0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
1c8d0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
1c8e0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
1c8f0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
1c900 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
1c910 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
1c920 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
1c930 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
1c940 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
1c950 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
1c960 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
1c970 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
1c980 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
1c990 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
1c9a0 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c  bels that we wil
1c9b0 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20  l be needing.   
1c9c0 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20     */.     .    
1c9d0 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65    addrInitialize
1c9e0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1c9f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ca00 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42        addrGroupB
1ca10 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65  yChange = sqlite
1ca20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ca30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f  );.      addrPro
1ca40 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65  cessRow = sqlite
1ca50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ca60 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1ca70 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
1ca80 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
1ca90 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
1caa0 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
1cab0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
1cac0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
1cad0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
1cae0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
1caf0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
1cb00 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
1cb10 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
1cb20 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
1cb30 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
1cb40 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
1cb50 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1cb60 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
1cb70 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
1cb80 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
1cb90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1cba0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1cbb0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1cbc0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1cbd0 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
1cbe0 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20  SortingIdx =.   
1cbf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cc00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1cc10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 41  penEphemeral, sA
1cc20 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1cc30 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67              sAgg
1cc50 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1cc60 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  umn, 0,.        
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1cc90 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1cca0 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
1ccb0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1ccc0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
1ccd0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
1cce0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
1ccf0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
1cd00 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
1cd10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1cd20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
1cd30 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cd40 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
1cd50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1cd60 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1cd70 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1cd80 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
1cd90 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
1cda0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
1cdb0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
1cdc0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
1cdd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cde0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1cdf0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
1ce00 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
1ce10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
1ce20 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
1ce30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ce40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1ce50 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
1ce60 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1ce70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
1ce80 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
1ce90 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
1cea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ceb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1cec0 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  0, addrInitializ
1ced0 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f  eLoop);..      /
1cee0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1cef0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1cf00 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
1cf10 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
1cf20 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
1cf30 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
1cf40 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
1cf50 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
1cf60 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
1cf70 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
1cf80 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
1cf90 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
1cfa0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
1cfb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
1cfc0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
1cfd0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
1cfe0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
1cff0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
1d000 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
1d010 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
1d020 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
1d030 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
1d040 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
1d050 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
1d060 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
1d070 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
1d080 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
1d090 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d0a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1d0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d0c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
1d0d0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
1d0e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d0f0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
1d100 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1d110 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d120 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1d130 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
1d140 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
1d150 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1d160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d180 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46  _IfMemPos, iUseF
1d190 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
1d1a0 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
1d1b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
1d1c0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
1d1d0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
1d1e0 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
1d1f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d200 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1d210 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  0);.      finali
1d220 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
1d230 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1d240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  );.      if( pHa
1d250 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
1d260 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1d270 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
1d280 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
1d290 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  w+1, 1);.      }
1d2a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
1d2b0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1d2c0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1d2d0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1d2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1d300 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
1d330 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
1d340 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20  tAbort, aff);.  
1d350 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d360 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1d370 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
1d380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74  AddOp2(v, OP_Ret
1d3a0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1d3b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d3c0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
1d3d0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
1d3e0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
1d3f0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d400 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
1d410 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
1d420 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
1d430 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1d440 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
1d450 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1d460 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
1d470 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
1d480 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
1d490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d4a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp2(v, OP_Retu
1d4b0 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rn, 0, 0);..    
1d4c0 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
1d4d0 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
1d4e0 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
1d4f0 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
1d500 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
1d510 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
1d520 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
1d530 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
1d540 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
1d550 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
1d560 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
1d570 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
1d580 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
1d590 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
1d5a0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
1d5b0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
1d5c0 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
1d5d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1d5e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d5f0 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69  bel(v, addrIniti
1d600 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20  alizeLoop);.    
1d610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d620 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d630 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1d640 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1d650 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1d660 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1d670 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
1d680 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  upBy, 0);.      
1d690 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1d6a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1d6b0 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
1d6c0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
1d6d0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
1d6e0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
1d6f0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
1d700 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
1d710 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
1d720 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
1d730 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
1d740 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
1d750 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1d760 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
1d770 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
1d780 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
1d790 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
1d7a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1d7b0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1d7c0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
1d7d0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
1d7e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d7f0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
1d800 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
1d810 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
1d820 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
1d830 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
1d840 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
1d850 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
1d860 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
1d870 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
1d880 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
1d890 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1d8a0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
1d8b0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
1d8c0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
1d8d0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
1d8e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
1d8f0 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
1d900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d910 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1d920 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
1d930 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1d940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d950 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
1d960 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1d970 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  x, 0);.        j
1d980 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
1d990 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  pr+1;.        fo
1d9a0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
1d9b0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1d9d0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d9e0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
1d9f0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
1da00 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
1da10 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63  rterColumn<j ) c
1da20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1da30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1da40 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70  deGetColumn(v, p
1da50 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
1da60 3e 69 43 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e 69  >iColumn,pCol->i
1da70 54 61 62 6c 65 2c 30 29 3b 0a 20 20 20 20 20 20  Table,0);.      
1da80 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1da90 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1daa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dab0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a  OP_MakeRecord, j
1dac0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1dad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dae0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
1daf0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1db00 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  gIdx, 0);.      
1db10 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1db20 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1db30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1db40 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
1db50 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1db60 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
1db70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
1db80 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
1db90 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
1dba0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
1dbb0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
1dbc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1dbd0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
1dbe0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
1dbf0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
1dc00 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
1dc10 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
1dc20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1dc30 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
1dc40 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
1dc50 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
1dc60 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
1dc70 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1dc80 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
1dc90 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
1dca0 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
1dcb0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
1dcc0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1dcd0 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
1dce0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
1dcf0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
1dd00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1dd10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1dd20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1dd30 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1dd40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1dd50 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1dd60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dd70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dd80 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e  P_Column, sAggIn
1dd90 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a  fo.sortingIdx, j
1dda0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1ddb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
1ddc0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
1ddd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
1dde0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1ddf0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
1de00 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 30 29 3b  >a[j].pExpr, 0);
1de10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1de20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1de30 64 4f 70 32 28 76 2c 20 6a 3c 70 47 72 6f 75 70  dOp2(v, j<pGroup
1de40 42 79 2d 3e 6e 45 78 70 72 2d 31 3f 4f 50 5f 4d  By->nExpr-1?OP_M
1de50 6f 76 65 3a 4f 50 5f 43 6f 70 79 2c 20 30 2c 20  ove:OP_Copy, 0, 
1de60 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
1de70 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47  }.      for(j=pG
1de80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  roupBy->nExpr-1;
1de90 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
1dea0 20 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75       if( j<pGrou
1deb0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  pBy->nExpr-1 ){.
1dec0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ded0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dee0 50 5f 53 43 6f 70 79 2c 20 69 42 4d 65 6d 2b 6a  P_SCopy, iBMem+j
1def0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1df00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1df10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1df20 53 43 6f 70 79 2c 20 69 41 4d 65 6d 2b 6a 2c 20  SCopy, iAMem+j, 
1df30 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1df40 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j==0 ){.        
1df50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df60 4f 70 32 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  Op2(v, OP_Eq, 0x
1df70 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
1df80 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
1df90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1dfa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dfb0 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30  (v, OP_Ne, 0x200
1dfc0 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
1dfd0 6e 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nge);.        }.
1dfe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1dff0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
1e000 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  1, (void*)pKeyIn
1e010 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 34  fo->aColl[j], P4
1e020 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1e030 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
1e040 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1e050 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
1e060 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
1e070 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
1e080 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50  nge in the GROUP
1e090 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
1e0a0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
1e0b0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
1e0c0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
1e0d0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
1e0e0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
1e0f0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
1e100 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
1e110 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
1e120 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
1e130 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
1e140 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
1e150 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
1e160 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
1e170 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
1e180 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
1e190 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
1e1a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1e1b0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
1e1c0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
1e1d0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
1e1e0 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
1e1f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1e200 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e210 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f  Label(v, addrGro
1e220 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20  upByChange);.   
1e230 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1e240 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1e250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
1e260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e270 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 4d 65 6d  , OP_Move, iBMem
1e280 2b 6a 2c 20 69 41 4d 65 6d 2b 6a 29 3b 0a 20 20  +j, iAMem+j);.  
1e290 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1e2a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e2b0 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1e2c0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1e2d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1e2e0 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
1e2f0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
1e300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e310 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
1e320 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
1e330 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
1e340 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
1e350 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
1e360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e380 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65  Gosub, 0, addrRe
1e390 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
1e3a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
1e3b0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
1e3c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
1e3d0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
1e3e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
1e3f0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1e400 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
1e410 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
1e420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1e430 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1e440 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72  eLabel(v, addrPr
1e450 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20  ocessRow);.     
1e460 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1e470 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1e480 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1e490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e4a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1e4b0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
1e4c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1e4d0 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
1e4e0 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
1e4f0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
1e500 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
1e510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1e520 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1e530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e550 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
1e560 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
1e570 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
1e580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e590 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1e5a0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
1e5b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1e5c0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
1e5d0 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
1e5e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e5f0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
1e600 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
1e610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e630 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  2(v, OP_Gosub, 0
1e640 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
1e650 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1e660 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
1e670 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20  final row"));.  
1e680 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
1e690 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a  dif pGroupBy */.
1e6a0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
1e6b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
1e6c0 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  ax = 0;.      Ex
1e6d0 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
1e6e0 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b  ;.      u8 flag;
1e6f0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
1e700 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
1e710 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
1e720 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
1e730 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1e740 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
1e750 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
1e760 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
1e770 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
1e780 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
1e790 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
1e7a0 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
1e7b0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
1e7c0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
1e7d0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
1e7e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
1e7f0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
1e800 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
1e810 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a  lause. .      **
1e820 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
1e830 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
1e840 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
1e850 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
1e860 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76  n.      ** add v
1e870 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
1e880 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
1e890 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
1e8a0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  er the .      **
1e8b0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
1e8c0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
1e8d0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1e8e0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
1e8f0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
1e900 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
1e910 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
1e920 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
1e930 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  m .      ** valu
1e940 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
1e950 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
1e960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1e970 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
1e980 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
1e990 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1e9a0 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
1e9b0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  ly.      ** modi
1e9c0 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
1e9d0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
1e9e0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49  *.      **   + I
1e9f0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
1ea00 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
1ea10 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
1ea20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a  coded by.      *
1ea30 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
1ea40 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
1ea50 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
1ea60 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
1ea70 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ue.      **     
1ea80 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a  for x..      **.
1ea90 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
1eaa0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
1eab0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
1eac0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
1ead0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
1eae0 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
1eaf0 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
1eb00 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
1eb10 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
1eb20 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20   on .      **   
1eb30 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
1eb40 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
1eb50 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
1eb60 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
1eb70 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
1eb80 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
1eb90 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
1eba0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
1ebb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
1ebc0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
1ebd0 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  y(pParse, p);.  
1ebe0 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
1ebf0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
1ec00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1ec10 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
1ec20 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
1ec30 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
1ec40 69 66 28 20 70 4d 69 6e 4d 61 78 20 29 7b 0a 20  if( pMinMax ){. 
1ec50 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
1ec60 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
1ec70 20 3d 20 28 28 66 6c 61 67 3d 3d 4f 52 44 45 52   = ((flag==ORDER
1ec80 42 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20  BY_MIN)?0:1);.  
1ec90 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
1eca0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
1ecb0 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
1ecc0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
1ecd0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 7d  inMax;.        }
1ece0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ecf0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
1ed00 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
1ed10 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
1ed20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
1ed30 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1ed40 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
1ed50 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
1ed60 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
1ed70 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
1ed80 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1ed90 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
1eda0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1edb0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1edc0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1edd0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1ede0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1edf0 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
1ee00 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69  , flag);.      i
1ee10 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
1ee20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ee30 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44  xprListDelete(pD
1ee40 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  el);.        got
1ee50 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1ee60 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61      }.      upda
1ee70 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
1ee80 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1ee90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 69  ;.      if( !pMi
1eea0 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a  nMax && flag ){.
1eeb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1eec0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1eed0 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
1eee0 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
1eef0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ef00 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
1ef10 22 2c 20 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42  ", (flag==ORDERB
1ef20 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
1ef30 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")));.      }.  
1ef40 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1ef50 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1ef60 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1ef70 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1ef80 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1ef90 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1efa0 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1efb0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1efc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1efd0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1efe0 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20   addrEnd, 1);.  
1eff0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
1f000 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1f010 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1f020 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
1f050 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61  rEnd, addrEnd, a
1f060 66 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ff);..      sqli
1f070 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1f080 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(pDel);.    }. 
1f090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1f0a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1f0b0 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
1f0c0 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
1f0d0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
1f0e0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1f0f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f100 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
1f110 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
1f120 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
1f130 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
1f140 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
1f150 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1f160 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
1f170 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
1f180 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
1f190 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
1f1a0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
1f1b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1f1c0 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1f1d0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1f1e0 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1f1f0 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1f200 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1f210 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1f220 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1f230 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1f240 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1f250 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1f260 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1f270 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1f280 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1f290 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1f2a0 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1f2b0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1f2c0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1f2d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1f2e0 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1f2f0 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1f300 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1f310 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1f320 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1f330 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1f340 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1f350 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1f360 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f370 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1f380 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1f390 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1f3a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f3b0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1f3c0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1f3d0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1f3e0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1f3f0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1f400 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1f410 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1f420 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1f430 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1f440 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1f450 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1f460 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1f470 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1f480 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1f490 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1f4a0 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1f4b0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1f4c0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1f4d0 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1f4e0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1f4f0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1f500 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1f510 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1f520 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1f530 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1f540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f550 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
1f560 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
1f570 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
1f580 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1f590 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
1f5a0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
1f5b0 33 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e  3_free(sAggInfo.
1f5c0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
1f5d0 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
1f5e0 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
1f5f0 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
1f600 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1f610 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
1f620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f660 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ***.** The follo
1f670 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65  wing code is use
1f680 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
1f690 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
1f6a0 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74  .  The code.** t
1f6b0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73  hat follows does
1f6c0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e   not appear in n
1f6d0 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a  ormal builds..**
1f6e0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1f6f0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  es are used to p
1f700 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e  rint out the con
1f710 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70  tent of all or p
1f720 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72  art of a .** par
1f730 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75  se structures su
1f740 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20  ch as Select or 
1f750 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e  Expr.  Such prin
1f760 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c  touts are useful
1f770 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20  .** for helping 
1f780 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68  to understand wh
1f790 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  at is happening 
1f7a0 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20  inside the code 
1f7b0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72  generator.** dur
1f7c0 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f  ing the executio
1f7d0 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c  n of complex SEL
1f7e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
1f7f0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1f800 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c  ine are not call
1f810 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d  ed anywhere from
1f820 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d   within the norm
1f830 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e  al.** code base.
1f840 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e    Then are inten
1f850 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ded to be called
1f860 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
1f870 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20   debugger.** or 
1f880 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22  from temporary "
1f890 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e  printf" statemen
1f8a0 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  ts inserted for 
1f8b0 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f  debugging..*/.vo
1f8c0 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
1f8d0 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
1f8e0 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  if( p->token.z &
1f8f0 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29  & p->token.n>0 )
1f900 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1f910 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22  ugPrintf("(%.*s"
1f920 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d  , p->token.n, p-
1f930 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c  >token.z);.  }el
1f940 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
1f950 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22  ebugPrintf("(%d"
1f960 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20  , p->op);.  }.  
1f970 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a  if( p->pLeft ){.
1f980 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f990 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
1f9a0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f9b0 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  r(p->pLeft);.  }
1f9c0 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
1f9d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1f9e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
1f9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1fa00 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29  tExpr(p->pRight)
1fa10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1fa20 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b  ebugPrintf(")");
1fa30 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
1fa40 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70  rintExprList(Exp
1fa50 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1fa60 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1fa70 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1fa80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
1fa90 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c  ite3PrintExpr(pL
1faa0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1fab0 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73  ;.    if( i<pLis
1fac0 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  t->nExpr-1 ){.  
1fad0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1fae0 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20  Printf(", ");.  
1faf0 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
1fb00 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
1fb10 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
1fb20 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69   indent){.  sqli
1fb30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fb40 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c  %*sSELECT(%p) ",
1fb50 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b   indent, "", p);
1fb60 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  .  sqlite3PrintE
1fb70 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
1fb80 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
1fb90 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1fba0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b    if( p->pSrc ){
1fbb0 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66  .    char *zPref
1fbc0 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ix;.    int i;. 
1fbd0 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52     zPrefix = "FR
1fbe0 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  OM";.    for(i=0
1fbf0 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
1fc00 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1fc10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fc20 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1fc30 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1fc40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1fc50 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64  intf("%*s ", ind
1fc60 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b  ent+6, zPrefix);
1fc70 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d  .      zPrefix =
1fc80 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70   "";.      if( p
1fc90 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1fca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fcb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e  DebugPrintf("(\n
1fcc0 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
1fcd0 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70  te3PrintSelect(p
1fce0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
1fcf0 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20  ndent+10);.     
1fd00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1fd10 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e  rintf("%*s)", in
1fd20 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20  dent+8, "");.   
1fd30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
1fd40 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
1fd50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1fd60 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49  gPrintf("%s", pI
1fd70 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1fd80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1fd90 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20  Item->pTab ){.  
1fda0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1fdb0 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65  ugPrintf("(table
1fdc0 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70  : %s)", pItem->p
1fdd0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1fde0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1fdf0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
1fe00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1fe10 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20  ebugPrintf(" AS 
1fe20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  %s", pItem->zAli
1fe30 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
1fe40 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63     if( i<p->pSrc
1fe50 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20  ->nSrc-1 ){.    
1fe60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1fe70 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20  Printf(",");.   
1fe80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1fe90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1fea0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n");.    }.  }. 
1feb0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
1fec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1fed0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48  ugPrintf("%*s WH
1fee0 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ERE ", indent, "
1fef0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1ff00 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65  rintExpr(p->pWhe
1ff10 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
1ff20 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1ff30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1ff40 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1ff50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ff60 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59  tf("%*s GROUP BY
1ff70 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1ff80 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1ff90 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
1ffa0 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
1ffb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ffc0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1ffd0 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
1ffe0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1fff0 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47  intf("%*s HAVING
20000 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
20010 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
20020 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
20030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20040 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
20050 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
20060 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
20070 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20080 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22  ("%*s ORDER BY "
20090 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
200a0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
200b0 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
200c0 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
200d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
200e0 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64  ");.  }.}./* End
200f0 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
20100 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67  e debug printing
20110 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   code.**********
20120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20160 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ***/.#endif /* d
20170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
20180 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
20190 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a  QLITE_DEBUG) */.