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

Artifact 0f7779b0c1c317dcac0f65f695d036030c16775f:


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 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3d50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3d60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3d70: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3d90: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3da0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3db0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3dd0: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3de0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3df0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3e10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3e20: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3e30: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3e50: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3e60: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e80: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3e90: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3ea0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3eb0: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3ed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3ee0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3ef0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3f00: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3f10: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3f20: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3f30: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3f40: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3f50: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3f60: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3f70: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3f80: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3f90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3fa0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3fb0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3fc0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3fd0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3fe0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ff0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
4000: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
4010: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
4020: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
4030: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
4040: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
4050: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
4060: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4070: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
4080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4090: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
40a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
40b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
40c0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
40d0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
40e0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
40f0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
4100: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
4110: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
4120: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
4130: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
4140: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
4150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4160: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
4170: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
4180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
41a0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
41b0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
41c0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
41d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
41e0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
41f0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4200: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
4210: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
4220: 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65  em, N);.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4240: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
4250: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4270: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4280: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
4290: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
42a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
42b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
42d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
42e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
42f0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
4300: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
4310: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
4320: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
4330: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
4340: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
4350: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
4360: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
4370: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
4380: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
4390: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
43a0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
43b0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
43c0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
43d0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
43e0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
43f0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
4400: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4410: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
4420: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
4430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4440: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
4450: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4470: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
4480: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
4490: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
44a0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
44b0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
44d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
44e0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
44f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4500: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4510: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4520: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4530: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4540: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
4550: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4580: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
4590: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
45a0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
45b0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
45c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
45d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
45e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
45f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
4610: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4620: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
4630: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
4640: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
4650: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
4660: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
4670: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
4680: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
4690: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
46a0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
46b0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
46c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
46d0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
46e0: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
46f0: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
4700: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
4710: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
4720: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4730: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4740: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
4750: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
4760: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
4770: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
4780: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
4790: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
47a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
47b0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
47c0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
47d0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
47e0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
47f0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
4800: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
4810: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4830: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
4840: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
4850: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
4860: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
4870: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
4880: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
4890: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
48a0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
48b0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
48c0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
48d0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
48e0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
48f0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4900: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4910: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4920: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4930: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
4940: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
4950: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
4960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
4970: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
4980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
49b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
49d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
49e0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
49f0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4a00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4a10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4a20: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4a30: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
4a40: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
4a50: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
4a60: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
4a70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
4a80: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
4a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4aa0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4ab0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4ac0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4ad0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4ae0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4af0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4b00: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
4b10: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
4b20: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
4b30: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
4b40: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
4b50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4b60: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
4b70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4b80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
4b90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4bb0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4bc0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4bd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4c00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
4c10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
4c20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c40: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
4c50: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
4c60: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
4c70: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
4c80: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
4c90: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
4ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
4cb0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
4cc0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
4cd0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
4ce0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
4cf0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4d00: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
4d10: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
4d20: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
4d30: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4d40: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
4d50: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
4d60: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
4d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
4d90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
4da0: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
4db0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
4dc0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4dd0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
4de0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
4df0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
4e00: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
4e10: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
4e20: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4e30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4e40: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4e50: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4e60: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4e70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4e80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4e90: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4ed0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4ee0: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4ef0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4f00: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4f10: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4f20: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4f30: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4f40: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4f50: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4f60: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4f70: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4f80: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4f90: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4fa0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4fb0: 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  Sdst;.  if( nCol
4fc0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4fd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5000: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
5010: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
5020: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
5030: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
5040: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
5050: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
5060: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
5070: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
5080: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
5090: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
50a0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
50b0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
50c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
5130: 70 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  put)?SQLITE_ECEL
5140: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e  _DUP:0);.  }.  n
5150: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5160: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5170: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5180: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5190: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
51a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
51b0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
51c0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51d0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51e0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51f0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
5200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
5210: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
5220: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5230: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5250: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5260: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5270: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5290: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
52a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
52b0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
52c0: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52d0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52e0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5300: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5310: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5320: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5330: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5350: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5360: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5370: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5380: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5390: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
53a0: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
53b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
53c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53e0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
5400: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
5410: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
5420: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5430: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5440: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5450: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5460: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5470: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5480: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5490: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
54a0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
54b0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
54c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54d0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54e0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54f0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
5500: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
5510: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
5520: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5530: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5540: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5550: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5560: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5570: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5580: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5590: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
55a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
55b0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
55c0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55f0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
5600: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5620: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5640: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5650: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5660: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5670: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5680: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
56b0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
56c0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56d0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5710: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
5720: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5760: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5770: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5780: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
57a0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
57b0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
57c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57d0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57f0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5810: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
5820: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5830: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5860: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5870: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5890: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
58a0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
58b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5900: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5910: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5920: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5930: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5940: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5950: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5960: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5990: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59b0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
59c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
5a00: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
5a10: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
5a20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a30: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a70: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a90: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5aa0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5ab0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5ad0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5af0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b10: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5b20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b50: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b70: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b80: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b90: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5bb0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5bc0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5bd0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5be0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bf0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5c00: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5c10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5c20: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c70: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5ca0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5cb0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5cc0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5cd0: 73 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  se SRT_DistTable
5ce0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
5cf0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5d00: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
5d10: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5d20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
5d40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d50: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5d70: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
5d80: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5d90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5da0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5db0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5dc0: 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  , r1);.#ifndef S
5dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
5de0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
5df0: 53 52 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b  SRT_DistTable ){
5e00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5e10: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
5e20: 73 20 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65  s DistTable, the
5e30: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
5e40: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
5e50: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
5e60: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
5e70: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
5e80: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
5e90: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
5ea0: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
5eb0: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
5ec0: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
5ed0: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
5ee0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
5ef0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
5f00: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
5f10: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
5f20: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
5f30: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
5f40: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
5f50: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
5f60: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5f70: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
5f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
5fa0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
5fb0: 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
5fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5fd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
5fe0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
5ff0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6000: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
6010: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
6020: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6030: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
6040: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
6050: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
6060: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  p, r1);.      }e
6070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
6080: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
6090: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
60a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
60b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
60c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
60d0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
60e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
60f0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
6100: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
6110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6120: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6130: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
6140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6150: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6160: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6180: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6190: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
61a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
61b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
61c0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
61d0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
61e0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
61f0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
6200: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
6210: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
6220: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
6230: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
6240: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
6250: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
6260: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
6270: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
6280: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
6290: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
62a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
62b0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
62c0: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
62d0: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
62e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
62f0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
6300: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
6310: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
6320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  t);.      if( pO
6330: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6340: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
6350: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
6360: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
6370: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
6380: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
6390: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
63a0: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
63b0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
63c0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
63d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
63e0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
63f0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
6400: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
6410: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
6420: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
6430: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
6440: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
6450: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
6460: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a   p, regResult);.
6470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6480: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
6490: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
64a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
64b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64c0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
64d0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31  ord, regResult,1
64e0: 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66  ,r1, &pDest->aff
64f0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
6500: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6510: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6520: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6530: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
6540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6550: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6560: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
6570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6580: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6590: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
65a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
65b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
65c0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
65d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
65e0: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
65f0: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
6600: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
6610: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
6620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6630: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6640: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
6650: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6660: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6670: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6680: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
66a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
66b0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
66c0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
66d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
66e0: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
66f0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
6700: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
6710: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
6720: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
6730: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
6740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6750: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
6760: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6770: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
6780: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6790: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
67a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
67b0: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
67c0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
67d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
67e0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
67f0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
6800: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
6810: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6820: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
6830: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
6840: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
6850: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6860: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
6870: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
6880: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
6890: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
68a0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
68b0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
68c0: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
68d0: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
68e0: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
68f0: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
6900: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
6910: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6920: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
6930: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
6940: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6950: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6960: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
6970: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
6980: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
69a0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
69b0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
69c0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
69d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
69e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
69f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6a00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6a10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a30: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6a40: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
6a50: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
6a60: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
6a70: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
6a80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
6a90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6aa0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6ab0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6ac0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
6ad0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6af0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6b00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
6b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6b40: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
6b50: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
6b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6b70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6b80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6b90: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
6ba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
6bc0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6bd0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
6be0: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
6bf0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
6c00: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
6c10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6c20: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
6c30: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
6c40: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
6c50: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
6c60: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
6c70: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
6c80: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
6c90: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
6ca0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
6cb0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
6cc0: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
6cd0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6ce0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
6cf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
6d00: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6d10: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
6d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d30: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
6d40: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
6d50: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
6d60: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
6d70: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
6d80: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
6d90: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
6da0: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
6db0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
6dc0: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
6dd0: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
6de0: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
6df0: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  By==0 && p->iLim
6e00: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
6e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6e20: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
6e30: 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
6e40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6e50: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
6e60: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
6e70: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
6e80: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
6e90: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
6ea0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
6eb0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
6ec0: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
6ed0: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
6ee0: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
6ef0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
6f00: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
6f30: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
6f40: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
6f50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
6f60: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6f70: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
6f80: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
6f90: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
6fa0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
6fb0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
6fc0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
6fd0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
6fe0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
6ff0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
7000: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
7010: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7020: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
7030: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
7040: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
7050: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
7060: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
7070: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
7080: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
7090: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
70a0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
70b0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
70c0: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
70d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
70e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
70f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
7100: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
7110: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
7120: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
7130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7140: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7150: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
7160: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
7170: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7180: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
7190: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
71a0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
71b0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
71c0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
71d0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
71e0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
71f0: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
7200: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
7210: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
7220: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
7230: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
7240: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
7250: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
7260: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
7270: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
7280: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
7290: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
72a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
72b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
72c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
72d0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
72e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
72f0: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
7300: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
7310: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
7320: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
7330: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7340: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
7350: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
7360: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
7370: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
7380: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
7390: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
73a0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
73b0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
73c0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
73d0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
73e0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
73f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
7400: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
7410: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
7420: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
7430: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
7440: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
7450: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
7460: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
7470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
7480: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
7490: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
74a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
74b0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
74c0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
74d0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
74e0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
74f0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
7500: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
7510: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
7520: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
7530: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
7540: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
7550: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
7560: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7570: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  st){.  int nExpr
7580: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
7590: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
75a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
75b0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
75c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
75d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
75e0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
75f0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
7600: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
7610: 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
7620: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
7630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7640: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
7650: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
7660: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
7670: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
7680: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
7690: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
76a0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
76b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
76c0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
76d0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
76e0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
76f0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
7700: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
7710: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
7720: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
7730: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7740: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
7750: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
7760: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
7770: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7780: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
7790: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
77a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
77b0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
77c0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
77d0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
77e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
77f0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
7800: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
7810: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
7820: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
7830: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
7840: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
7850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
7860: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
7870: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
7880: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
7890: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
78a0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
78b0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
78c0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
78d0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
78e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
78f0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
7900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7910: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
7920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7930: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
7940: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
7950: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
7960: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
7970: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
7980: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
7990: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
79a0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
79b0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
79c0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
79d0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
79e0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
79f0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
7a00: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
7a10: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
7a20: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
7a30: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
7a40: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
7a50: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
7a60: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
7a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7a80: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
7a90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
7aa0: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
7ab0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
7ac0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
7ad0: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
7ae0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
7af0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
7b00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7b10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
7b20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7b30: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
7b40: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
7b50: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
7b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7b80: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7b90: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7ba0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7bb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
7bc0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
7bd0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
7be0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
7bf0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
7c00: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
7c10: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
7c20: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7c30: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
7c40: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
7c50: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
7c60: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
7c70: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
7c80: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
7c90: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
7ca0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
7cb0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7cc0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
7cd0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
7ce0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
7cf0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
7d00: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
7d10: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
7d20: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
7d30: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
7d40: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
7d50: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
7d60: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
7d70: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
7d80: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
7d90: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
7da0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
7db0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
7dc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7dd0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
7de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7df0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7e00: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
7e10: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7e20: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7e30: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7e40: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7e50: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7e60: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
7e70: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7e80: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7e90: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7ea0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7eb0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
7ec0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
7ed0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
7ee0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
7ef0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7f00: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
7f10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
7f20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
7f30: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
7f40: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
7f50: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
7f60: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
7f70: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
7f80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7f90: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
7fa0: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
7fb0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
7fc0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
7fd0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
7fe0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
7ff0: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
8000: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
8010: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
8020: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
8030: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
8040: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
8050: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
8060: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
8070: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
8090: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
80a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
80b0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
80c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
80d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80e0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
80f0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
8120: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
8130: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
8140: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
8170: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
8180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8190: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
81a0: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
81b0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
81e0: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
81f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
8200: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
8210: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
8220: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
8230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
8240: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8250: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
8260: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8270: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
8280: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
8290: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
82a0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
82b0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
82c0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
82d0: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
82e0: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
82f0: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
8300: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
8310: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
8320: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
8330: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8340: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
8350: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
8360: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
8370: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
8380: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
8390: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
83a0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
83b0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
83c0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
83d0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
83e0: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
83f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
8400: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
8410: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
8420: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
8430: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
8440: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
8450: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
8460: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
8470: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
8480: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
8490: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
84a0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
84b0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
84c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
84d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
84e0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
84f0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
8500: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
8510: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
8520: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8530: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8540: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
8550: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
8560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8570: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
8580: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
8590: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
85a0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
85b0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
85c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
85d0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
85e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
85f0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
8600: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
8610: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
8620: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
8630: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
8640: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
8650: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
8660: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
8670: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
8680: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8690: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
86a0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
86b0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
86c0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
86d0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
86e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
86f0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
8700: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
8710: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
8720: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
8730: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a  Dest->iSDParm;..
8740: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
8750: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
8760: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
8770: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65  ->iECursor;.  re
8780: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
8790: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
87a0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
87b0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
87c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
87d0: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
87e0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
87f0: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
8800: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8810: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
8820: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
8830: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65  nColumn);.    re
8840: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65  gRowid = 0;.  }e
8850: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
8860: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
8870: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8880: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46   }.  if( p->selF
8890: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72  lags & SF_UseSor
88a0: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
88b0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
88c0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
88d0: 69 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61 72  int ptab2 = pPar
88e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
88f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8900: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
8910: 64 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f  do, ptab2, regSo
8920: 72 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d  rtOut, pOrderBy-
8930: 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61  >nExpr+2);.    a
8940: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
8950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8960: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
8970: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
8980: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8990: 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  , p, addrContinu
89a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
89b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
89c0: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
89d0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20  , regSortOut);. 
89e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
89f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8a00: 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72  n, ptab2, pOrder
8a10: 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
8a20: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
8a30: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8a40: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8a50: 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  HE);.  }else{.  
8a60: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
8a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8a80: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
8a90: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
8aa0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
8ab0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
8ac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8ad0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
8ae0: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
8af0: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
8b00: 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69  gRow);.  }.  swi
8b10: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
8b20: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
8b30: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
8b40: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
8b50: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8b60: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
8b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8b80: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
8b90: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
8ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8bb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
8bc0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
8bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8be0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8bf0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8c00: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
8c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8c30: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8c50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8c60: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
8c70: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
8c80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
8c90: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
8ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8cb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
8cc0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
8cd0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
8d00: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
8d10: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8d20: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8d30: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
8d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8d50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8d60: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
8d70: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
8d80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8d90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
8da0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8db0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
8dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8dd0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
8de0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
8df0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
8e00: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8e10: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
8e20: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8e30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
8e50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
8e60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
8e70: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
8e80: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
8e90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8ea0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
8eb0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
8ec0: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
8ed0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8ee0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
8ef0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8f00: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
8f10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f20: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
8f30: 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20  Sdst+i );.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8f60: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
8f70: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b  pDest->iSdst+i);
8f80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
8f90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
8fa0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8fb0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
8fc0: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
8fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8fe0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ff0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9020: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
9030: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
9040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9050: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
9060: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
9070: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
9080: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
9090: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
90b0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
90c0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
90d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
90e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
90f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9100: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
9110: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
9120: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9130: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
9140: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
9150: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
9160: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9170: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
9180: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
9190: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
91a0: 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  F_UseSorter ){. 
91b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
91d0: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
91e0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
91f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9200: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
9210: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  Tab, addr);.  }.
9220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
9230: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
9240: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65  rBreak);.  if( e
9250: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
9260: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
9270: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
9280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9290: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
92a0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
92b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
92c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
92d0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
92e0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
92f0: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
9300: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9310: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
9320: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
9330: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
9340: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
9350: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
9360: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
9370: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
9380: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
9390: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
93a0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
93b0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
93c0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
93d0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
93e0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
93f0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
9400: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
9410: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
9420: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9430: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
9440: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
9450: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
9460: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
9470: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
9480: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
9490: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
94a0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
94b0: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
94c0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
94d0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
94e0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
94f0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
9500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
9510: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
9520: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
9530: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
9540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
9550: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
9560: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
9570: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9580: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
9590: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
95a0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
95b0: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
95c0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
95d0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
95e0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
95f0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
9600: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
9610: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
9620: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
9630: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
9640: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
9650: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
9660: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
9670: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
9680: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9690: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
96a0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
96b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
96c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
96d0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
96e0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
96f0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
9700: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
9710: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
9720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9730: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
9740: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9750: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
9760: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
9770: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
9780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9790: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
97a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
97b0: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
97c0: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
97d0: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
97e0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
97f0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
9800: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
9810: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
9820: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
9830: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9840: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
9850: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9860: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9870: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
9880: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
9890: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
98a0: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
98b0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
98c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
98d0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
98e0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
98f0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9900: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9910: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
9920: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
9930: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
9940: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
9950: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
9960: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
9970: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
9980: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9990: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
99a0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
99b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
99c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
99d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
99e0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
99f0: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
9a00: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
9a10: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
9a20: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
9a30: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
9a40: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
9a50: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
9a60: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
9a70: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
9a80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
9a90: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
9ab0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
9ac0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
9ad0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
9ae0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
9af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
9b00: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
9b10: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
9b20: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
9b30: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
9b40: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
9b50: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
9b60: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
9b70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9b80: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
9b90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9ba0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9bb0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
9bc0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
9bd0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
9be0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
9bf0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
9c00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
9c10: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
9c20: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
9c30: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
9c40: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
9c50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
9c60: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
9c70: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
9c80: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
9c90: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
9ca0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
9cb0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
9cc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cd0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
9ce0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
9cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
9d00: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
9d20: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
9d30: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
9d40: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
9d50: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
9d60: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
9d70: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
9d80: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
9d90: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
9da0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
9db0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
9dc0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
9dd0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
9de0: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
9df0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
9e00: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
9e10: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
9e20: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
9e30: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
9e40: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
9e50: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
9e60: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
9e70: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
9e80: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
9e90: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
9ea0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
9eb0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
9ec0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
9ed0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
9ee0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
9ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f00: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
9f10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
9f20: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
9f30: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
9f40: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
9f50: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
9f60: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
9f70: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
9f80: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
9f90: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
9fa0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
9fb0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
9fc0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
9fd0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
9fe0: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
9ff0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
a000: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
a010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
a020: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
a030: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
a040: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
a050: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
a060: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
a070: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
a080: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
a090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0b0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
a0c0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
a0d0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
a0e0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
a0f0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
a100: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
a110: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
a120: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
a130: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
a140: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
a150: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
a160: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
a170: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
a180: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
a190: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
a1a0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
a1b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a1c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
a1d0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
a1e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
a1f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
a200: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
a210: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
a220: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
a230: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
a240: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
a250: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
a260: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
a270: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
a280: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
a290: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
a2a0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
a2b0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
a2c0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
a2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a2e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a2f0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
a300: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
a310: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
a320: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
a330: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a340: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
a350: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
a360: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a370: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
a380: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
a390: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
a3a0: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
a3b0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
a3c0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
a3d0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
a3e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
a3f0: 4c 57 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68  LWAYS(pTab->pSch
a400: 65 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ema) ){.        
a410: 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20  /* A real table 
a420: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a430: 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20  t( !pS );.      
a440: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
a450: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
a460: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
a470: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
a480: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a490: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23  pTab->nCol) );.#
a4a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a4b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
a4c0: 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20  ATA.        if( 
a4d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
a4e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
a4f0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
a500: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
a510: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
a520: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
a530: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a540: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a550: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
a560: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
a570: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
a580: 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20       estWidth = 
a590: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a5a0: 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20  .szEst;.        
a5b0: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54  }.        zOrigT
a5c0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
a5d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
a5e0: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
a5f0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
a600: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
a610: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
a620: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
a630: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
a640: 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e   zOrigDb = pNC->
a650: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
a660: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
a670: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
a680: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a690: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a6a0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
a6b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a6c0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
a6d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a6e0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
a6f0: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
a700: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
a710: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  Est;.        }.#
a720: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
a730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a740: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a750: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
a760: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
a770: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
a780: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a790: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
a7a0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
a7b0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
a7c0: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
a7d0: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
a7e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
a7f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
a800: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
a810: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
a820: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
a830: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
a840: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
a850: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
a860: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d  .      Expr *p =
a870: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
a880: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
a890: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a8a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a8b0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
a8c0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
a8d0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
a8e0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
a8f0: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
a900: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
a910: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
a920: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
a930: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
a940: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
a950: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
a960: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
a970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a980: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
a990: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
a9a0: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
a9b0: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
a9c0: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
a9d0: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
a9e0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
a9f0: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
aa00: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
aa10: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
aa20: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
aa30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
aa40: 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70  ( pEstWidth ) *p
aa50: 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69  EstWidth = estWi
aa60: 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  dth;.  return zT
aa70: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
aa80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
aa90: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
aaa0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
aab0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
aac0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
aad0: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
aae0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
aaf0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
ab00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ab10: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
ab20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
ab30: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
ab40: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
ab50: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
ab60: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
ab70: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
ab80: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
ab90: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
aba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
abb0: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
abc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
abd0: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
abe0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
abf0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
ac00: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
ac10: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
ac20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
ac30: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ac40: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
ac50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
ac60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ac70: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
ac80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
ac90: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
aca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
acb0: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
acc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
acd0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
ace0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
acf0: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
ad00: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
ad10: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
ad20: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
ad30: 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20  igCol, 0);..    
ad40: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
ad50: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
ad60: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
ad70: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
ad80: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
ad90: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
ada0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
adb0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
adc0: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
add0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
ade0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
adf0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
ae00: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ae10: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
ae20: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
ae30: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ae40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ae50: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ae60: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
ae70: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
ae80: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
ae90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
aea0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
aeb0: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
aec0: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
aed0: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
aee0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
aef0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
af00: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  0, 0, 0, 0);.#en
af10: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
af20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
af30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
af40: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
af50: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
af60: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
af70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
af80: 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a  IT_DECLTYPE) */.
af90: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
afa0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
afb0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
afc0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
afd0: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
afe0: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
aff0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
b000: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
b010: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
b020: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
b030: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
b040: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
b050: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
b060: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b070: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
b080: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
b090: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
b0a0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
b0b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
b0c0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
b0d0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
b0e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
b0f0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
b100: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
b110: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
b120: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b130: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
b140: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
b150: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
b160: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b170: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
b180: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
b190: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
b1a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
b1b0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
b1c0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
b1d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
b1e0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45  NamesSet || NEVE
b1f0: 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  R(v==0) || db->m
b200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
b210: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
b220: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
b230: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
b240: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
b250: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
b260: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
b270: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
b280: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
b290: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
b2a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
b2b0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
b2c0: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
b2d0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
b2e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
b2f0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
b300: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
b310: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
b320: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
b330: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
b340: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
b350: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b360: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
b370: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
b380: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
b390: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
b3a0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
b3b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
b3c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
b3d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
b3e0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
b3f0: 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61  G_COLUMN) && pTa
b400: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
b410: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
b420: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
b430: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
b440: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
b450: 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
b460: 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (j<pTabList->nSr
b470: 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  c); j++){.      
b480: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
b490: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d  a[j].iCursor==p-
b4a0: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
b4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
b4c0: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
b4d0: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
b4e0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
b4f0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
b500: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
b510: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
b520: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
b530: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
b540: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
b550: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
b560: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
b570: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
b580: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
b590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
b5a0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
b5b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
b5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b5d0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
b5e0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
b5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b600: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b610: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
b620: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b630: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b640: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
b650: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
b660: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
b670: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
b690: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
b6a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
b6b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
b6c0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
b6d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
b6f0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
b700: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
b710: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
b720: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
b730: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b740: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b750: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
b760: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
b770: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
b780: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
b790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7a0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
b7b0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
b7c0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
b7d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b7e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
b7f0: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
b800: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
b810: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b820: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
b830: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
b840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b850: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
b860: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
b870: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
b880: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
b890: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
b8a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
b8b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
b8c0: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
b8d0: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
b8e0: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
b8f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
b900: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b910: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
b920: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
b930: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
b940: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
b950: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
b960: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
b970: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
b980: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
b990: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
b9a0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
b9b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
b9c0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
b9d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
b9e0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
b9f0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ba00: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ba10: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ba20: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ba30: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
ba40: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
ba50: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
ba60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ba70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ba80: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ba90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
baa0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
bab0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
bac0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
bad0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
bae0: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
baf0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
bb00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
bb10: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
bb20: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
bb30: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
bb40: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
bb50: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
bb60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bb70: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
bb80: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bb90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
bba0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
bbb0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bbc0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
bbd0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
bbe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bbf0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
bc00: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
bc10: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
bc20: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
bc30: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
bc40: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
bc50: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
bc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc80: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
bc90: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bca0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bcc0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
bcd0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
bce0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
bcf0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
bd00: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
bd10: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
bd20: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
bd30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bd40: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
bd50: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
bd60: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
bd70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
bd80: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
bd90: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
bda0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
bdb0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
bdc0: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
bdd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
bde0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
bdf0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
be00: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
be10: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
be20: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
be30: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
be40: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
be50: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
be60: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
be70: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
be80: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
be90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
bea0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
beb0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
bec0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
bed0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
bee0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
bef0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
bf00: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
bf10: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
bf20: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
bf30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bf40: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bf50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
bf60: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
bf70: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
bf80: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
bf90: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
bfa0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
bfb0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
bfc0: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
bfd0: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
bfe0: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
bff0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
c000: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
c010: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
c020: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
c030: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
c040: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
c050: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
c060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c070: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c080: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
c090: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
c0a0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
c0b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
c0c0: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
c0d0: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
c0e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
c0f0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
c100: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
c110: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
c120: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
c130: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c140: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c150: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
c160: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c170: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
c180: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
c190: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
c1a0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
c1b0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
c1c0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c1d0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
c1e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
c1f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
c200: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
c210: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
c220: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
c230: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
c240: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
c250: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
c260: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
c270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
c280: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
c290: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
c2a0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
c2b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c2c0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
c2d0: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
c2e0: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
c2f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
c300: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c310: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c320: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
c330: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c340: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
c350: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
c360: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
c370: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
c380: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
c390: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
c3a0: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
c3b0: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
c3c0: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
c3d0: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
c3e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c3f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
c400: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
c410: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c420: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
c430: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
c440: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
c450: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
c460: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
c470: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
c480: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
c490: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
c4a0: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
c4b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
c4c0: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
c4d0: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
c4e0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
c4f0: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
c500: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c510: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
c520: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
c530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c540: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c550: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c560: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
c570: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
c580: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
c590: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
c5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
c5b0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
c5c0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
c5d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c5e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
c5f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
c600: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
c610: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c620: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
c630: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
c640: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
c650: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
c660: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c670: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
c6a0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
c6b0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
c6c0: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
c6d0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
c6e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
c6f0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
c700: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
c710: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
c720: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
c730: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
c740: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
c750: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
c760: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
c770: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
c780: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
c790: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
c7a0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
c7b0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
c7c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
c7d0: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
c7e0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
c7f0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
c800: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
c810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c820: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
c830: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
c840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c850: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c860: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
c870: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
c890: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
c8a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
c8b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
c8c0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c8d0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
c8e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
c8f0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
c900: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
c910: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c920: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
c930: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
c940: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
c950: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
c960: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
c970: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c980: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
c990: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
c9a0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
c9b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
c9c0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
c9d0: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
c9e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
c9f0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
ca00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
ca10: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
ca20: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
ca30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ca40: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
ca50: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
ca60: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
ca70: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
ca80: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
ca90: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
caa0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
cab0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cac0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
cad0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
cae0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
caf0: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
cb00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
cb10: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
cb20: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
cb30: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
cb40: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
cb50: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
cb60: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
cb70: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
cb80: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
cb90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
cba0: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
cbb0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
cbc0: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
cbd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
cbe0: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
cbf0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
cc00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
cc10: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
cc20: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
cc30: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
cc40: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
cc50: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
cc60: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
cc70: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
cc80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
cc90: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
cca0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ccb0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
ccc0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ccd0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
cce0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ccf0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
cd00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
cd10: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
cd20: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
cd30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cd40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
cd50: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
cd60: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
cd70: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
cd80: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
cd90: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
cda0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cdb0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
cdc0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
cdd0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
cde0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
cdf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ce00: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ce10: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ce20: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ce30: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ce40: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ce50: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
ce60: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ce70: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
ce80: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ce90: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
cea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ceb0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
cec0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ced0: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
cee0: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
cef0: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
cf00: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
cf10: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
cf20: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
cf30: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
cf40: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
cf50: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
cf60: 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
cf70: 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c  576;.  selectCol
cf80: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
cf90: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
cfa0: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
cfb0: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
cfc0: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
cfd0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
cfe0: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
cff0: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
d000: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
d010: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
d020: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d030: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
d040: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
d050: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d060: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
d070: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
d080: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
d090: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
d0a0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
d0b0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
d0c0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
d0d0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
d0e0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
d0f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d100: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
d110: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
d120: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
d130: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d140: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
d150: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
d160: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
d170: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
d180: 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
d190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d1a0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
d1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d1c0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
d1d0: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
d1e0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
d1f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
d200: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
d210: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
d220: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
d230: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d240: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d250: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
d260: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d270: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
d280: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d290: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
d2a0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
d2b0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
d2c0: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
d2d0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
d2e0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
d2f0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
d300: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
d310: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
d320: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
d330: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
d340: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
d350: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
d360: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
d370: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
d380: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
d390: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
d3a0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
d3b0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
d3c0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
d3d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d3e0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
d3f0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
d400: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
d410: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
d420: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d430: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
d440: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
d450: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
d460: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
d470: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
d480: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
d490: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
d4a0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
d4b0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
d4c0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
d4d0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
d4e0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
d4f0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
d500: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
d510: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
d520: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
d530: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
d540: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
d550: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
d560: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
d570: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
d580: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
d590: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
d5a0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
d5b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
d5c0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d5d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d5e0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
d5f0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
d600: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
d610: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
d620: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
d630: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
d640: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
d650: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
d660: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
d670: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
d680: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
d690: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
d6a0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
d6b0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
d6c0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
d6d0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
d6e0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
d6f0: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
d700: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
d710: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
d720: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
d730: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
d740: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
d750: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
d760: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
d770: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
d780: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
d790: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d7a0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
d7b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d7c0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d7d0: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
d7e0: 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20   /* VDBE should 
d7f0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d800: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
d810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d820: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
d830: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
d840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d850: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d860: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
d870: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d880: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
d890: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
d8a0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d8d0: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
d8e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
d8f0: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
d900: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
d910: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
d920: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
d930: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d950: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
d960: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
d970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d980: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
d990: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
d9a0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d9b0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
d9c0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
d9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d9e0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
d9f0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
da00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
da10: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
da20: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
da30: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
da40: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
da50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
da60: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
da70: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
da80: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
da90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
daa0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
dab0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
dac0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
dad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
dae0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
daf0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
db00: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
db10: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
db20: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
db30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
db40: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
db50: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
db60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db70: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
db80: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
db90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dba0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dbb0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dbc0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dbd0: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
dbe0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
dbf0: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
dc00: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
dc10: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
dc20: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
dc30: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc40: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
dc50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dc60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc70: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
dc80: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
dc90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dca0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
dcb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
dcc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
dcd0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
dce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dcf0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
dd00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
dd10: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
dd20: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
dd30: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
dd40: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
dd50: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
dd60: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
dd70: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
dd80: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
dd90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dda0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
ddb0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
ddc0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
ddd0: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
dde0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
ddf0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
de00: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
de10: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
de20: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
de30: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
de40: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
de50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
de60: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
de70: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
de80: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
de90: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
dea0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
deb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
dec0: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
ded0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
dee0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
def0: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
df00: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
df10: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
df20: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
df30: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
df40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
df50: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
df60: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
df70: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
df80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
df90: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
dfa0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
dfb0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
dfc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
dfd0: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
dfe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
dff0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e000: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e010: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
e030: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
e040: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
e050: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e060: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
e070: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
e080: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
e090: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
e0a0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e0b0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
e0c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e0d0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
e0e0: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
e0f0: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
e100: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
e110: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
e120: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
e130: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
e140: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
e150: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
e160: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
e170: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
e180: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
e190: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
e1a0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
e1b0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
e1c0: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
e1d0: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
e1e0: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
e1f0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
e200: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
e210: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
e220: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
e230: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
e240: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e250: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
e260: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
e270: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
e280: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
e290: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
e2a0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
e2b0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
e2c0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
e2d0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
e2e0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
e2f0: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
e300: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
e310: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
e320: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
e330: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e340: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
e350: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
e360: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
e370: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
e380: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
e390: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
e3a0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
e3b0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
e3c0: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
e3d0: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
e3e0: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
e3f0: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
e400: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
e410: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
e420: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
e430: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
e440: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
e450: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
e460: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
e470: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
e480: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
e490: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
e4a0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
e4b0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
e4c0: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
e4d0: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
e4e0: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
e4f0: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
e500: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
e510: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
e520: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
e530: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e540: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e550: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e560: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
e570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
e580: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
e590: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
e5a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
e5b0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
e5c0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
e5d0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
e5e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e5f0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
e600: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
e610: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
e620: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
e630: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
e640: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
e650: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
e660: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e680: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e690: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
e6a0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
e6b0: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
e6c0: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
e6d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
e6e0: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
e6f0: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
e700: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
e710: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
e720: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
e730: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e740: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
e750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
e760: 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
e770: 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
e780: 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
e790: 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
e7a0: 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
e7b0: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
e7c0: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
e7d0: 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
e7e0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e7f0: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
e800: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
e810: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
e820: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
e830: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
e840: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
e850: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
e860: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
e870: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
e880: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
e890: 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
e8a0: 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
e8b0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
e8c0: 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
e8d0: 74 28 20 70 2d 3e 70 52 65 63 75 72 73 65 3d 3d  t( p->pRecurse==
e8e0: 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
e8f0: 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
e900: 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
e910: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
e920: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
e930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
e940: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
e950: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
e960: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
e970: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
e980: 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20  tmost );.  dest 
e990: 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
e9a0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
e9b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e9c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
e9d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e9e0: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
e9f0: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
ea00: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
ea10: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
ea20: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ea30: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ea40: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
ea50: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
ea60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ea70: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
ea80: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
ea90: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
eaa0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
eab0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
eac0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
ead0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
eae0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
eaf0: 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
eb00: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
eb10: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
eb20: 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
eb30: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
eb40: 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
eb50: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
eb60: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
eb70: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
eb80: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
eb90: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
eba0: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
ebb0: 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
ebc0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ebd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ebe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ebf0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
ec00: 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
ec10: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
ec20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ec30: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
ec40: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
ec50: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
ec60: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
ec70: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
ec80: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
ec90: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
eca0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
ecb0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
ecc0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
ecd0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
ece0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
ecf0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
ed00: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
ed10: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
ed20: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
ed30: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65  ){.    if( p->se
ed40: 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
ed50: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
ed60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ed70: 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
ed80: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
ed90: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
eda0: 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ms");.    }else{
edb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
edc0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
edd0: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
ede0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
edf0: 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64   %s".        " d
ee00: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
ee10: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
ee20: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
ee30: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
ee40: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  p));.    }.    r
ee50: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
ee60: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ee70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
ee80: 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
ee90: 76 65 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20  ve query, check 
eea0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
eeb0: 20 4f 52 44 45 52 20 42 59 20 6f 72 0a 20 20 2a   ORDER BY or.  *
eec0: 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20  * LIMIT clause. 
eed0: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
eee0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
eef0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ef00: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
ef10: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 69 66  ->pLimit );.  if
ef20: 28 20 70 2d 3e 70 52 65 63 75 72 73 65 20 26 26  ( p->pRecurse &&
ef30: 20 28 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c   (p->pOrderBy ||
ef40: 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b 0a 20   p->pLimit) ){. 
ef50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ef60: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 20 69  sg(pParse, "%s i
ef70: 6e 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  n a recursive qu
ef80: 65 72 79 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ery is not allow
ef90: 65 64 22 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e  ed",.        p->
efa0: 70 4f 72 64 65 72 42 79 20 3f 20 22 4f 52 44 45  pOrderBy ? "ORDE
efb0: 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 0a  R BY" : "LIMIT".
efc0: 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
efd0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
efe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
eff0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
f000: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
f010: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
f020: 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
f030: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f040: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f050: 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
f060: 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
f070: 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
f080: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f090: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
f0a0: 70 2d 3e 70 52 65 63 75 72 73 65 20 29 7b 0a 20  p->pRecurse ){. 
f0b0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d     int nCol = p-
f0c0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
f0d0: 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
f0e0: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 77  ;.    int addrSw
f0f0: 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6e  ap;.    int iCon
f100: 74 2c 20 69 42 72 65 61 6b 3b 0a 20 20 20 20 69  t, iBreak;.    i
f110: 6e 74 20 74 6d 70 31 2c 20 74 6d 70 32 3b 20 20  nt tmp1, tmp2;  
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f130: 43 75 72 73 6f 72 73 20 75 73 65 64 20 74 6f 20  Cursors used to 
f140: 61 63 63 65 73 73 20 74 65 6d 70 6f 72 61 72 79  access temporary
f150: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69   tables */.    i
f160: 6e 74 20 74 6d 70 33 20 3d 20 30 3b 20 20 20 20  nt tmp3 = 0;    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f180: 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
f190: 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
f1a0: 4e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 44 65  N */.    int eDe
f1b0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
f1c0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 74      SelectDest t
f1d0: 6d 70 32 64 65 73 74 3b 0a 0a 20 20 20 20 69 42  mp2dest;..    iB
f1e0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
f1f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f200: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
f210: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f220: 28 76 29 3b 0a 0a 20 20 20 20 74 6d 70 31 20 3d  (v);..    tmp1 =
f230: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f240: 0a 20 20 20 20 74 6d 70 32 20 3d 20 70 50 61 72  .    tmp2 = pPar
f250: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
f260: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
f270: 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 65 44 65  ION ){.      eDe
f280: 73 74 20 3d 20 53 52 54 5f 44 69 73 74 54 61 62  st = SRT_DistTab
f290: 6c 65 3b 0a 20 20 20 20 20 20 74 6d 70 33 20 3d  le;.      tmp3 =
f2a0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f2c0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
f2d0: 28 26 74 6d 70 32 64 65 73 74 2c 20 65 44 65 73  (&tmp2dest, eDes
f2e0: 74 2c 20 74 6d 70 32 29 3b 0a 0a 20 20 20 20 73  t, tmp2);..    s
f2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f300: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f310: 65 72 61 6c 2c 20 74 6d 70 31 2c 20 6e 43 6f 6c  eral, tmp1, nCol
f320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f330: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
f340: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d  penEphemeral, tm
f350: 70 32 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69  p2, nCol);.    i
f360: 66 28 20 74 6d 70 33 20 29 7b 0a 20 20 20 20 20  f( tmp3 ){.     
f370: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f380: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
f390: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f3a0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70  enEphemeral, tmp
f3b0: 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  3, 0);.      p->
f3c0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
f3d0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
f3e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
f3f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
f400: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 53 45 4c   the initial SEL
f410: 45 43 54 20 69 6e 20 74 6d 70 32 2e 20 2a 2f 0a  ECT in tmp2. */.
f420: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f430: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f440: 50 72 69 6f 72 2c 20 26 74 6d 70 32 64 65 73 74  Prior, &tmp2dest
f450: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f460: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f470: 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 43  t_end;..    /* C
f480: 6c 65 61 72 20 74 6d 70 31 2e 20 54 68 65 6e 20  lear tmp1. Then 
f490: 73 77 69 74 63 68 20 74 68 65 20 63 6f 6e 74 65  switch the conte
f4a0: 6e 74 73 20 6f 66 20 74 6d 70 31 20 61 6e 64 20  nts of tmp1 and 
f4b0: 74 6d 70 32 2e 20 54 68 65 6e 20 74 65 74 75 72  tmp2. Then tetur
f4c0: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  n .    ** the co
f4d0: 6e 74 65 6e 74 73 20 6f 66 20 74 6d 70 31 20 74  ntents of tmp1 t
f4e0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 4f 72  o the caller. Or
f4f0: 2c 20 69 66 20 74 6d 70 31 20 69 73 20 65 6d 70  , if tmp1 is emp
f500: 74 79 20 61 74 20 74 68 69 73 0a 20 20 20 20 2a  ty at this.    *
f510: 2a 20 70 6f 69 6e 74 2c 20 74 68 65 20 72 65 63  * point, the rec
f520: 75 72 73 69 76 65 20 71 75 65 72 79 20 68 61 73  ursive query has
f530: 20 66 69 6e 69 73 68 65 64 20 2d 20 6a 75 6d 70   finished - jump
f540: 20 74 6f 20 61 64 64 72 65 73 73 20 69 42 72 65   to address iBre
f550: 61 6b 2e 20 20 2a 2f 0a 20 20 20 20 61 64 64 72  ak.  */.    addr
f560: 53 77 61 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Swap = sqlite3Vd
f570: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
f580: 77 61 70 43 75 72 73 6f 72 73 2c 20 74 6d 70 31  wapCursors, tmp1
f590: 2c 20 74 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c  , tmp2);.    sql
f5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f5b0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 6d 70  , OP_Rewind, tmp
f5c0: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
f5d0: 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
f5e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f5f0: 72 28 76 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  r(v);.    select
f600: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
f610: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
f620: 74 6d 70 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tmp1, p->pEList-
f630: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
f640: 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
f650: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
f660: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f670: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
f680: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
f690: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f6a0: 4e 65 78 74 2c 20 74 6d 70 31 2c 20 61 64 64 72  Next, tmp1, addr
f6b0: 4e 65 78 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  Next);..    /* E
f6c0: 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
f6d0: 73 69 76 65 20 53 45 4c 45 43 54 2e 20 53 74 6f  sive SELECT. Sto
f6e0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
f6f0: 6e 20 74 6d 70 32 2e 20 57 68 69 6c 65 20 74 68  n tmp2. While th
f700: 69 73 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  is.    ** SELECT
f710: 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65   is running, the
f720: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 6d 70   contents of tmp
f730: 31 20 61 72 65 20 72 65 61 64 20 62 79 20 72 65  1 are read by re
f740: 63 75 72 73 69 76 65 20 0a 20 20 20 20 2a 2a 20  cursive .    ** 
f750: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
f760: 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 20 20  e current CTE.  
f770: 2a 2f 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  */.    p->pPrior
f780: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 52 65   = 0;.    p->pRe
f790: 63 75 72 73 65 2d 3e 74 6e 75 6d 20 3d 20 74 6d  curse->tnum = tm
f7a0: 70 31 3b 0a 20 20 20 20 70 2d 3e 70 52 65 63 75  p1;.    p->pRecu
f7b0: 72 73 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  rse->tabFlags |=
f7c0: 20 54 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   TF_Recursive;. 
f7d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
f7e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
f7f0: 20 26 74 6d 70 32 64 65 73 74 29 3b 0a 20 20 20   &tmp2dest);.   
f800: 20 70 2d 3e 70 52 65 63 75 72 73 65 2d 3e 74 61   p->pRecurse->ta
f810: 62 46 6c 61 67 73 20 26 3d 20 7e 54 46 5f 52 65  bFlags &= ~TF_Re
f820: 63 75 72 73 69 76 65 3b 0a 20 20 20 20 70 2d 3e  cursive;.    p->
f830: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
f840: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
f850: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f860: 65 6e 64 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  end;..    sqlite
f870: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f880: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
f890: 77 61 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wap);.    sqlite
f8a0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f8b0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
f8c0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
f8d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
f8e0: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
f8f0: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
f900: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
f910: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f920: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f930: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
f940: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
f950: 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
f960: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
f970: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
f980: 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
f990: 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
f9a0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
f9b0: 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
f9c0: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
f9d0: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
f9e0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
f9f0: 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
fa00: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65  pOffset;.      e
fa10: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
fa20: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
fa30: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
fa40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fa50: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
fa60: 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
fa70: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
fa80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
fa90: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
faa0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fab0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
fac0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
fad0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
fae0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
faf0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
fb00: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
fb10: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
fb20: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
fb30: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
fb40: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
fb50: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
fb60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
fb70: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
fb80: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
fb90: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
fba0: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
fbb0: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
fbc0: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
fbd0: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
fbe0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
fbf0: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
fc00: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fc10: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
fc20: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
fc30: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
fc40: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
fc50: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
fc60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
fc70: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
fc80: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
fc90: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
fca0: 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
fcb0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
fcc0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
fcd0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
fce0: 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
fcf0: 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
fd00: 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
fd10: 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
fd20: 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
fd30: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
fd40: 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
fd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fd60: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
fd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fd80: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
fd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fda0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fdb0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
fdc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
fdd0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
fde0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
fdf0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
fe00: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
fe10: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
fe20: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
fe30: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
fe40: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
fe50: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
fe60: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
fe70: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
fe80: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
fe90: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
fea0: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
feb0: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
fec0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
fed0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
fee0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
fef0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
ff00: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
ff10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
ff20: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
ff30: 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
ff40: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
ff50: 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
ff60: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
ff70: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
ff80: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
ff90: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
ffa0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
ffb0: 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70  rOp && ALWAYS(!p
ffc0: 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70  ->pLimit &&!p->p
ffd0: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
ffe0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
fff0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
10000 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
10010 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
10020 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
10030 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
10040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10050 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20  ->pRightmost!=p 
10060 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  );  /* Can only 
10070 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77  happen for leftw
10080 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  ard elements.   
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20    ** of a 3-way 
100c0 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64  or more compound
100d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
100e0 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
100f0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
10100 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
10110 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
10120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10130 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
10140 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
10150 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
10160 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
10170 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
10180 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
10190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
101a0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
101b0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
101c0 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
101d0 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
101e0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
101f0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
10200 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10210 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
10220 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
10230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10240 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
10250 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
10260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10270 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10280 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
10290 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
102a0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
102b0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
102c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
102d0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
102e0 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
102f0 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
10300 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
10310 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
10320 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10330 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
10340 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
10350 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10360 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
10370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
10380 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
10390 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
103a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
103b0 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
103c0 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
103d0 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
103e0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
103f0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
10400 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
10410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10420 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10430 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
10440 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
10450 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10460 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10470 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
10480 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
10490 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
104a0 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
104b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
104c0 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
104d0 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
104e0 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
104f0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
10500 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
10510 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
10520 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
10530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
10540 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
10550 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
10560 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
10570 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
10580 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
10590 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
105a0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
105b0 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
105c0 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
105d0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
105e0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
105f0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
10600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10610 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10620 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
10630 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10650 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
10660 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
10670 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
10680 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
10690 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
106a0 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
106b0 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
106c0 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
106d0 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
106e0 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
106f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
10700 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
10710 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
10720 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
10730 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
10740 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
10750 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
10760 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
10770 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
10780 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
10790 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
107a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
107b0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
107c0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
107d0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
107e0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
107f0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10800 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
10810 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
10820 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
10830 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
10840 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
10850 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
10860 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
10870 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
10880 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
10890 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
108a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
108b0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
108c0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
108d0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
108e0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
108f0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
10900 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
10910 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10920 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
10930 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10940 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
10950 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
10960 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
10970 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
10980 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
10990 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
109a0 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
109b0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
109c0 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
109d0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
109e0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
109f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
10a00 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
10a10 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10a20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
10a30 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10a40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10a50 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
10a60 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
10a70 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
10a80 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
10a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10aa0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10ab0 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
10ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
10ad0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
10ae0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10af0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
10b00 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
10b10 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
10b20 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
10b30 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b50 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
10b60 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
10b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b80 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10b90 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
10ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10bb0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
10bc0 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
10bd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10be0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10bf0 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
10c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
10c20 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
10c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10c50 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
10c60 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
10c70 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
10c80 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
10c90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
10ca0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10cb0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10cc0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10cd0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10ce0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10cf0 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
10d00 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
10d10 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
10d20 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
10d30 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
10d40 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
10d50 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
10d60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
10d70 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
10d80 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
10d90 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
10da0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
10db0 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
10dc0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
10dd0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
10de0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
10df0 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
10e00 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
10e10 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10e20 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
10e30 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10e40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
10e50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
10e60 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
10e70 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
10e80 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
10e90 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
10ea0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
10eb0 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
10ec0 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  most->selFlags |
10ed0 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
10ee0 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
10ef0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
10f00 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
10f10 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
10f20 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
10f30 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
10f40 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
10f50 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10f60 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
10f70 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
10f80 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
10f90 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
10fa0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
10fb0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
10fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10fd0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10fe0 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
10ff0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
11000 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11010 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11020 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11030 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
11040 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
11050 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
11060 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
11070 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11080 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11090 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
110a0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
110b0 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
110c0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
110d0 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
110e0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
110f0 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
11100 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
11110 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
11120 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
11130 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
11140 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
11150 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
11160 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
11170 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
11180 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
11190 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
111a0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
111b0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
111c0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
111d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
111e0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
111f0 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
11200 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
11210 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
11220 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
11230 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
11240 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
11250 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
11260 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
11270 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
11280 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
11290 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
112a0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
112c0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
112d0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
112e0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
112f0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
11300 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
11310 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
11320 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
11330 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
11340 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
11350 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
11360 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
11370 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
11380 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
11390 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
113a0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
113b0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
113c0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
113d0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
113e0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
113f0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
11400 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
11410 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
11420 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
11430 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
11440 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
11450 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11460 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
11470 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
11480 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11490 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
114a0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
114b0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
114c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
114e0 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
114f0 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
11500 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11510 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11520 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
11530 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11540 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
11550 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
11560 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
11570 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
11580 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
11590 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
115a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
115b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
115c0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
115d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
115e0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
115f0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11610 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
11620 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
11630 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
11640 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11650 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
11660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11670 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
11680 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
11690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
116a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
116b0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
116c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116d0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
116e0 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
116f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11700 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
11710 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
11720 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11730 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
11740 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
11750 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
11760 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
11770 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
11780 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11790 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
117a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
117b0 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
117c0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
117d0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
117e0 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
117f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
11800 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
11810 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
11820 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
11830 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
11840 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
11850 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
11860 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
11870 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
11880 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
11890 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
118a0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
118b0 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
118c0 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
118d0 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
118e0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
118f0 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
11900 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
11910 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
11920 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
11930 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
11940 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11960 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11970 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
11980 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
11990 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
119a0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
119b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
119c0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
119d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
119e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
119f0 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
11a00 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
11a10 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
11a20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11a30 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11a40 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
11a50 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
11a60 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a80 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11a90 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
11aa0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
11ab0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
11ac0 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
11ad0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11ae0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
11af0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
11b00 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31  lloc(db, nCol, 1
11b10 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
11b20 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
11b30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11b40 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
11b50 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11b60 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
11b70 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
11b80 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
11b90 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
11ba0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
11bb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
11bc0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
11bd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
11be0 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
11bf0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
11c00 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
11c10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
11c20 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
11c30 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
11c40 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
11c50 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
11c60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
11c70 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
11c80 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
11c90 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
11ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
11cb0 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
11cc0 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
11cd0 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
11ce0 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
11cf0 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
11d00 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
11d10 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
11d20 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
11d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
11d40 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
11d50 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
11d60 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11d70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11d90 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
11da0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
11db0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11dc0 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
11dd0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
11de0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
11df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
11e10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
11e20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
11e30 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
11e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11e50 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
11e60 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
11e70 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
11e80 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
11e90 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  >iSdst = dest.iS
11ea0 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  dst;.  pDest->nS
11eb0 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74  dst = dest.nSdst
11ec0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11ed0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
11ee0 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
11ef0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
11f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
11f10 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
11f20 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
11f30 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
11f40 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
11f50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11f60 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
11f70 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
11f80 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
11f90 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
11fa0 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
11fb0 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
11fc0 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
11fd0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
11fe0 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
11ff0 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
12000 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
12010 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
12020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
12030 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
12040 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
12050 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
12060 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
12070 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
12080 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
12090 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
120a0 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
120b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
120c0 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
120d0 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
120e0 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
120f0 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
12100 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
12110 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
12120 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
12130 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
12140 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
12150 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
12160 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
12170 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
12180 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
12190 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
121a0 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
121b0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
121c0 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
121d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
121e0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
121f0 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
12200 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12210 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12220 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12230 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12240 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
12250 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
12260 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
12270 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
12280 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
12290 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
122a0 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
122b0 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
122c0 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
122d0 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
122e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
122f0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
12300 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
12310 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
12320 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
12330 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
12340 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
12350 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
12360 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
12370 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
12380 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
12390 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
123a0 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
123b0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
123c0 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
123d0 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
123e0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
123f0 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
12400 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
12410 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
12420 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12430 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
12440 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
12450 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
12460 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
12470 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
12480 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
12490 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
124a0 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
124b0 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
124c0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
124d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
124e0 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
124f0 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
12500 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12510 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
12520 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
12530 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
12560 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
12570 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
12580 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
12590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125a0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
125b0 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
125c0 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  j2+2);.    sqlit
125d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
125e0 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
125f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12600 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
12610 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
12620 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
12630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12650 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
12660 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
12670 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12680 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
12690 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
126a0 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
126b0 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
126c0 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
126d0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
126e0 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
126f0 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74  ntinue);..  swit
12700 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
12710 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
12720 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
12730 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
12740 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
12750 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
12760 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
12770 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
12780 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
12790 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
127a0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
127b0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
127c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
127d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
127e0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
127f0 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
12800 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74   testcase( pDest
12810 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
12820 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
12830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12840 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
12850 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
12860 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
12870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12880 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12890 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
128a0 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
128b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
128c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
128d0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
128e0 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
128f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12900 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12910 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
12920 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12930 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
12940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
12950 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12960 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
12970 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
12980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12990 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
129a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
129b0 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
129c0 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
129d0 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
129e0 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
129f0 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
12a00 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
12a10 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
12a20 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
12a30 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
12a40 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
12a50 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
12a60 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
12a70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
12a80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12a90 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
12aa0 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
12ab0 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20  fSdst = .       
12ac0 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
12ad0 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
12ae0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
12af0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b  pDest->affSdst);
12b00 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
12b10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12b20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
12b30 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12b40 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
12b50 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20   pIn->iSdst, 1, 
12b60 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53  r1, &pDest->affS
12b70 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71  dst,1);.      sq
12b80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
12b90 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
12ba0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
12bb0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
12bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12bd0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
12be0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
12bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12c00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12c10 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
12c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
12c30 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20  #if 0  /* Never 
12c40 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44  occurs on an ORD
12c50 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20  ER BY query */. 
12c60 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
12c70 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
12c80 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
12c90 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
12ca0 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
12cb0 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
12cc0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
12cd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12ce0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44  P_Integer, 1, pD
12cf0 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
12d00 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
12d10 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
12d20 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
12d30 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
12d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12d50 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
12d60 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
12d70 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
12d80 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
12d90 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
12da0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
12db0 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
12dc0 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
12dd0 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
12de0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
12df0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
12e00 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
12e10 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
12e20 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
12e30 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
12e40 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
12e50 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
12e60 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
12e70 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
12e80 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
12e90 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
12ea0 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
12eb0 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
12ec0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
12ed0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
12ee0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
12ef0 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
12f00 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
12f10 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
12f20 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
12f30 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
12f40 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
12f50 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
12f60 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
12f70 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
12f80 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
12f90 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
12fa0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
12fb0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
12fc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
12fd0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
12fe0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
12ff0 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
13000 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
13010 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13020 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
13030 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
13040 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
13050 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20  Dest->nSdst);.  
13060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13070 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
13080 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
13090 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
130a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
130b0 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
130c0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
130d0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
130e0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
130f0 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
13100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
13110 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
13120 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
13130 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
13140 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
13150 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
13160 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
13170 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
13180 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
13190 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
131a0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
131b0 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
131c0 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
131d0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
131e0 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
131f0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
13200 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
13210 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
13220 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
13230 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
13240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
13250 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
13260 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
13270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13280 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
13290 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
132a0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
132b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
132c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
132d0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
132e0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
132f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13300 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
13310 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
13320 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
13330 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
13340 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13350 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
13360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13370 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
13380 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
13390 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  , -1);.  }..  /*
133a0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
133b0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
133c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
133d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
133e0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
133f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13400 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
13410 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
13420 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13430 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
13440 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
13450 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
13460 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
13470 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
13480 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
13490 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
134a0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
134b0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
134c0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
134d0 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
134e0 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
134f0 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
13500 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
13510 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
13520 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
13530 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
13540 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
13550 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
13560 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
13570 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
13580 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13590 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
135a0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
135b0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
135c0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
135d0 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
135e0 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
135f0 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
13600 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
13610 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
13620 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
13630 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
13640 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
13650 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
13660 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
13670 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
13680 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
13690 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
136a0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
136b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
136c0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
136d0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
136e0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
136f0 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
13700 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
13720 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
13730 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
13740 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
13750 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
13760 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
13770 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
13780 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
13790 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
137a0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
137b0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
137c0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
137d0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
137e0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
137f0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
13800 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
13810 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
13820 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
13830 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
13840 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
13850 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
13860 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
13870 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
13880 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
13890 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
138a0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
138b0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
138c0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
138d0 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
138e0 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
138f0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
13900 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
13910 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
13920 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
13930 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
13940 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
13950 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
13960 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
13970 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
13980 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
13990 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
139a0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
139b0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
139c0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
139d0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
139e0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
139f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
13a00 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
13a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
13a20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
13a30 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
13a40 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
13a50 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
13a60 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
13a70 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
13a80 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
13a90 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
13aa0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
13ab0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
13ac0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
13ad0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
13ae0 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
13af0 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
13b00 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
13b10 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13b20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
13b30 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
13b40 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
13b50 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
13b60 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
13b70 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
13b80 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
13b90 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
13ba0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
13bb0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
13bc0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
13bd0 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
13be0 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
13bf0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
13c00 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
13c10 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
13c20 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
13c30 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
13c40 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
13c50 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
13c60 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
13c70 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
13c80 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
13c90 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
13ca0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
13cb0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
13cc0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
13cd0 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
13ce0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
13cf0 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
13d00 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
13d10 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
13d20 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
13d30 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
13d40 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
13d50 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
13d60 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
13d70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
13d80 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
13d90 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
13da0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
13db0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
13dc0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
13dd0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
13de0 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
13df0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
13e00 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
13e10 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
13e20 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
13e30 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
13e40 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
13e50 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
13e60 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
13e70 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
13e80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
13e90 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
13ea0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
13eb0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
13ec0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
13ed0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
13ee0 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
13ef0 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
13f00 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
13f10 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
13f20 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
13f30 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
13f40 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
13f50 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
13f60 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
13f70 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
13f80 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
13f90 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
13fa0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
13fb0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
13fc0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
13fd0 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
13fe0 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
13ff0 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
14000 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
14010 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
14020 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
14030 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
14040 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
14050 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
14060 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
14070 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
14080 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
14090 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
140a0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
140b0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
140c0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
140d0 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
140e0 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
140f0 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
14100 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
14110 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
14120 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
14130 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
14140 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
14150 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
14160 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
14170 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
14180 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
14190 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
141a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
141b0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
141c0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
141d0 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
141e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
141f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14200 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14210 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14220 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
14230 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
14240 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
14250 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
14260 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
14270 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
14280 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
14290 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
142a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
142b0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
142c0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
142d0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
142e0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
142f0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
14300 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
14310 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
14320 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
14330 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
14340 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
14350 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
14360 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
14370 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
14380 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
14390 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
143a0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
143b0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
143c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
143d0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
143e0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
143f0 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20  .  int regEofA; 
14400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
14410 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
14420 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f  n select-A is co
14430 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
14440 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
14450 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
14460 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
14470 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
14480 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20    int regEofB;  
14490 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
144a0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
144b0 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d   select-B is com
144c0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61  plete */.  int a
144d0 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
144e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
144f0 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
14500 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
14510 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
14520 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
14530 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
14540 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
14550 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
14560 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
14570 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
14580 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
14590 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
145a0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
145b0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
145c0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
145d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
145e0 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
145f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
14600 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
14610 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
14620 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d    int addrOutB =
14630 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65   0;     /* Addre
14640 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
14650 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
14660 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14680 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
14690 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
146a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
146b0 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
146c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
146d0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
146e0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
146f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
14700 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
14710 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
14720 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
14730 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
14740 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
14750 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
14760 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
14770 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
14780 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14790 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
147a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
147b0 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
147c0 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
147d0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
147e0 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
147f0 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
14800 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
14810 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
14820 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
14830 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
14840 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
14850 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
14860 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
14870 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
14880 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
14890 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
148a0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
148b0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
148c0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
148d0 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
148e0 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
148f0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
14900 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14910 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
14920 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
14930 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
14940 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
14950 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
14960 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
14970 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
14980 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
14990 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
149a0 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
149b0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
149c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
149d0 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
149e0 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
149f0 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
14a00 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
14a10 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
14a20 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
14a30 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
14a40 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
14a50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
14a60 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
14a70 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
14a80 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
14a90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14aa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
14ab0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14ac0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
14ad0 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
14ae0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
14af0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
14b00 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
14b10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
14b20 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
14b30 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
14b40 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
14b50 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
14b60 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
14b70 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
14b80 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
14b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ba0 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
14bb0 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
14bc0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
14bd0 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
14be0 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
14bf0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
14c00 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
14c10 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
14c20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
14c30 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
14c40 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
14c50 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
14c60 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
14c70 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
14c80 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
14c90 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
14ca0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
14cb0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
14cc0 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
14cd0 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
14ce0 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
14cf0 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
14d00 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
14d10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14d20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
14d30 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14d40 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
14d50 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
14d60 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
14d70 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
14d80 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
14d90 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
14da0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
14db0 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
14dc0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
14dd0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
14de0 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
14df0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
14e00 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
14e10 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
14e20 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
14e30 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
14e40 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
14e50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14e60 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
14e70 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
14e80 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
14e90 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
14ea0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
14eb0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
14ec0 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
14ed0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
14ee0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14ef0 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
14f00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14f10 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
14f20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
14f30 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
14f40 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
14f50 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
14f60 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
14f70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14f80 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
14f90 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
14fa0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
14fb0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
14fc0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
14fd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
14fe0 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
14ff0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
15000 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
15010 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
15020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15030 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
15040 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15050 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
15060 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
15070 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
15080 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
15090 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
150a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
150b0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
150c0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
150d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
150e0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
150f0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
15100 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
15110 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
15120 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15130 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
15140 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
15150 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
15160 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
15170 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
15180 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
15190 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
151a0 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
151b0 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
151c0 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
151d0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
151e0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
151f0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
15200 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15210 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
15220 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
15230 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
15240 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
15250 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
15260 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
15270 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
15280 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
15290 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
152a0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
152b0 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64  sizeof(int)*nOrd
152c0 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65  erBy);.  if( aPe
152d0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
152e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
152f0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f  m *pItem;.    fo
15300 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
15310 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64  derBy->a; i<nOrd
15320 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
15330 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
15340 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
15350 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20  rderByCol>0.    
15360 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
15370 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  u.x.iOrderByCol<
15380 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
15390 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
153a0 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
153b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
153c0 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
153d0 4b 65 79 4d 65 72 67 65 20 3d 20 73 71 6c 69 74  KeyMerge = sqlit
153e0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
153f0 62 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31 29 3b  b, nOrderBy, 1);
15400 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72  .    if( pKeyMer
15410 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ge ){.      for(
15420 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
15430 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   i++){.        C
15440 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
15450 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65         Expr *pTe
15460 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
15470 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15480 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
15490 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
154a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
154b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
154c0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
154d0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   pTerm);.       
154e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
154f0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
15500 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
15510 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65  rse, p, aPermute
15520 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
15530 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
15540 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
15550 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
15560 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
15570 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
15580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
15590 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
155a0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
155b0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
155c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
155d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
155e0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
155f0 65 28 70 4b 65 79 4d 65 72 67 65 29 20 29 3b 0a  e(pKeyMerge) );.
15600 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
15610 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  e->aColl[i] = pC
15620 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  oll;.        pKe
15630 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64  yMerge->aSortOrd
15640 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
15650 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
15660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
15680 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
15690 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
156a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
156b0 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
156c0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
156d0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
156e0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
156f0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
15700 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
15710 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
15720 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
15730 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
15740 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
15750 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
15760 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
15770 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
15780 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
15790 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
157a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
157b0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
157c0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
157d0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
157e0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
157f0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
15800 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
15810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
15820 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
15830 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
15840 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
15850 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
15860 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15870 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
15880 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
15890 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
158a0 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
158b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
158d0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
158e0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
158f0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
15900 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
15910 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
15920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15930 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
15940 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
15950 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
15960 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
15970 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
15980 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
15990 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
159a0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
159b0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
159c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
159d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
159e0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
159f0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
15a00 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
15a10 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
15a20 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
15a30 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Prior = 0;.  sql
15a40 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
15a50 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
15a60 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
15a70 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
15a80 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
15a90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15aa0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
15ab0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
15ac0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
15ad0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
15ae0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
15af0 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
15b00 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
15b10 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
15b20 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
15b30 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
15b40 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
15b50 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
15b60 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
15b70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
15b80 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
15b90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
15ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15bb0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
15bc0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
15bd0 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
15be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
15c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15c20 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
15c30 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
15c40 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
15c50 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
15c60 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
15c70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
15c80 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
15c90 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
15ca0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
15cb0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
15cc0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
15cd0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
15ce0 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
15cf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15d00 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
15d10 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
15d20 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
15d30 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
15d40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15d50 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
15d60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15d70 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
15d80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
15d90 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
15da0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
15db0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
15dc0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
15dd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
15de0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
15df0 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
15e00 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
15e10 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
15e20 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
15e30 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
15e40 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
15e50 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
15e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
15e70 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
15e80 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
15e90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15ea0 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
15eb0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
15ec0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
15ed0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15ee0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
15ef0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
15f00 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
15f10 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
15f20 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
15f30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
15f40 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
15f50 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
15f60 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
15f70 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
15f80 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
15f90 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
15fa0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
15fb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
15fc0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
15fd0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
15fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15ff0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
16000 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
16010 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16020 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
16030 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
16040 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
16050 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
16060 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
16070 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
16080 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
16090 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
160a0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
160b0 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
160c0 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
160d0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
160e0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
160f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16100 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
16110 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
16120 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
16130 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
16140 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
16150 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
16160 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
16170 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
16180 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
16190 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
161a0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
161b0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
161c0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
161d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
161e0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
161f0 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
16200 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
16210 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
16220 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
16230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16240 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
16250 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
16260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16270 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
16280 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
16290 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
162a0 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
162b0 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
162c0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
162d0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
162e0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
162f0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
16300 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
16310 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
16320 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
16330 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
16340 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
16350 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
16360 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
16370 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
16380 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
16390 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
163a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
163b0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
163c0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
163e0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
163f0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
16400 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
16410 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
16420 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
16430 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
16440 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
16450 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
16460 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
16470 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
16480 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
16490 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
164a0 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
164b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
164c0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
164d0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
164e0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
164f0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
16500 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
16510 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
16520 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
16530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16540 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
16550 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
16560 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
16570 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
16580 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
16590 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
165a0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
165b0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
165c0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
165d0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
165e0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
165f0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
16600 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
16610 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
16620 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69  broutine"));.  i
16630 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
16640 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
16650 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
16660 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
16670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16680 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64  oto, 0, labelEnd
16690 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  );.  }else{  .  
166a0 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
166b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
166c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
166d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
166e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
166f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
16700 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
16710 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
16720 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16730 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
16740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16760 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29  to, 0, addrEofA)
16770 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
16780 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
16790 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a  SelectRow;.  }..
167a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
167b0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
167c0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
167d0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
167e0 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
167f0 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
16800 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
16810 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
16820 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
16830 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
16840 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
16850 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
16860 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
16870 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
16880 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
16890 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
168a0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
168b0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
168c0 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
168d0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
168e0 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
168f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16900 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62  If, regEofA, lab
16910 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  elEnd);.    sqli
16920 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16930 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
16940 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
16950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16960 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
16970 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20  , regAddrA);.   
16980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16990 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
169a0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
169b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
169c0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
169d0 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
169e0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
169f0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
16a00 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
16a10 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
16a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16a30 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
16a40 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
16a50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16a60 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
16a70 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
16a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16a90 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
16aa0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
16ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ac0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16ad0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
16ae0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16af0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
16b00 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
16b10 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
16b20 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
16b30 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
16b40 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
16b50 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
16b60 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
16b70 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
16b80 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
16b90 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
16ba0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
16bb0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
16bc0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
16bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16be0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
16bf0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20  , regAddrA);.   
16c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c10 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16c20 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
16c30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16c40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
16c50 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
16c60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
16c70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
16c80 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
16c90 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
16ca0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
16cb0 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
16cc0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
16cd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
16ce0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
16cf0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
16d00 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
16d10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16d30 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
16d40 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
16d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16d60 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16d70 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74  gAddrB);.  sqlit
16d80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16d90 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
16da0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c  addrEofB);.  sql
16db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16dc0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
16dd0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
16de0 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
16df0 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
16e00 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
16e10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
16e20 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
16e30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16e40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16e50 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b  er, 0, regEofA);
16e60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16e70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16e80 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b  er, 0, regEofB);
16e90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16ea0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
16eb0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
16ec0 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69  SelectA);.  sqli
16ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ee0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64   OP_Gosub, regAd
16ef0 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42  drB, addrSelectB
16f00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16f10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
16f20 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
16f30 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
16f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16f50 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
16f60 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  EofB);..  /* Imp
16f70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
16f80 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
16f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16fa0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
16fb0 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
16fc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16fd0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
16fe0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
16ff0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
17000 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
17010 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17020 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
17030 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
17040 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
17070 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
17080 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
17090 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
170a0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
170b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
170c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
170d0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
170e0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a  eqB, addrAgtB);.
170f0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17100 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
17110 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
17120 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
17130 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
17140 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17150 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
17160 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
17170 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
17180 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
17190 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
171a0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
171b0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
171c0 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
171d0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
171e0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
171f0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
17200 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
17210 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
17220 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
17230 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
17240 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
17250 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
17260 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
17270 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
17280 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
17290 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
172a0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
172b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
172c0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
172d0 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
172e0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
172f0 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
17300 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
17310 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
17320 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
17330 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
17340 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
17350 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
17360 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
17370 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
17380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17390 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
173a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
173b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
173c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
173d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
173e0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
173f0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
17400 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
17410 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
17420 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
17430 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
17440 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
17450 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
17460 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
17470 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
17480 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
17490 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
174a0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
174b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
174c0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
174d0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
174e0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
174f0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
17500 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
17510 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
17520 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
17530 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
17540 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
17550 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17560 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
17570 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
17580 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
17590 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
175a0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
175b0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
175c0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
175d0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
175e0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
175f0 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
17600 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
17610 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
17620 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
17630 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
17640 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
17650 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
17660 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
17670 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
17680 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
17690 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
176a0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
176b0 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
176c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
176d0 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
176e0 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
176f0 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
17700 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
17710 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
17720 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
17730 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
17740 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
17750 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
17760 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
17770 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
17780 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
17790 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
177a0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
177b0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
177c0 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
177d0 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
177e0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
177f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
17800 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
17810 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
17820 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
17830 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
17840 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
17850 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
17860 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
17870 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
17880 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
17890 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
178a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
178b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
178c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
178d0 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
178e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
178f0 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
17900 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
17910 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
17920 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
17930 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
17940 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17950 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
17960 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
17970 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
17980 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
17990 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
179a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
179b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
179c0 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
179d0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
179e0 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
179f0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17a00 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
17a10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17a20 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
17a30 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
17a40 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
17a50 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
17a60 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
17a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
17a80 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
17a90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
17aa0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17ab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17ac0 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
17ad0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
17ae0 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  rList(.  sqlite3
17af0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
17b00 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
17b10 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
17b20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
17b30 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
17b40 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
17b50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
17b60 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tutes */.  int i
17b70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
17b80 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
17b90 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
17ba0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
17bb0 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
17bc0 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
17bd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17be0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17bf0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17c00 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
17c10 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
17c20 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
17c30 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
17c40 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
17c50 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
17c60 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
17c70 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
17c80 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
17c90 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
17ca0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
17cb0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
17cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
17cd0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
17ce0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
17cf0 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
17d00 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
17d10 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17d20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
17d30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
17d40 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
17d50 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
17d60 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
17d70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
17d80 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
17d90 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
17da0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
17db0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17dc0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
17dd0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17de0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17df0 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
17e00 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17e10 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17e20 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
17e30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17e40 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  );.  p->pHaving 
17e50 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
17e60 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62  p->pHaving, iTab
17e70 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
17e80 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
17e90 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
17ea0 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
17eb0 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
17ec0 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
17ed0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17ee0 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
17ef0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
17f00 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20  Src );  /* Even 
17f10 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77  for (SELECT 1) w
17f20 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20  e have: pSrc!=0 
17f30 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  but pSrc->nSrc==
17f40 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  0 */.  if( ALWAY
17f50 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66  S(pSrc) ){.    f
17f60 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
17f70 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
17f80 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
17f90 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
17fa0 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d  elect(db, pItem-
17fb0 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
17fc0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
17fd0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
17fe0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17ff0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
18000 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
18010 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
18020 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
18030 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18040 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
18050 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
18060 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  W)./*.** This ro
18070 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
18080 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
18090 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72  ries as a perfor
180a0 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  mance optimizati
180b0 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
180c0 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66  ine returns 1 if
180d0 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
180e0 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
180f0 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e  attening occurs.
18100 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
18110 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
18120 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
18130 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
18140 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
18150 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
18160 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
18170 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
18180 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
18190 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
181a0 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
181b0 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
181c0 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
181d0 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
181e0 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
181f0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
18200 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
18210 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
18220 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
18230 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
18240 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
18250 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
18260 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
18270 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
18280 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
18290 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
182a0 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
182b0 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
182c0 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
182d0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
182e0 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
182f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
18300 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
18310 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
18320 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
18330 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
18340 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
18350 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
18360 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
18370 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
18380 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
18390 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
183a0 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
183b0 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
183c0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
183d0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
183e0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
183f0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
18400 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
18410 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
18420 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
18430 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
18440 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
18450 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
18460 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
18470 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
18480 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
18490 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
184a0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
184b0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
184c0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
184d0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
184e0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
184f0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
18500 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
18510 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
18520 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
18530 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
18540 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
18550 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
18560 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
18570 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
18580 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
18590 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
185a0 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
185b0 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
185c0 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
185d0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
185e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
185f0 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
18600 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
18610 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
18620 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
18630 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
18640 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
18650 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
18660 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
18670 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
18680 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
18690 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
186a0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
186b0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
186c0 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
186d0 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
186e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
186f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
18700 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
18710 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
18720 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
18730 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
18740 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
18750 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
18760 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
18770 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
18780 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
18790 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
187a0 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
187b0 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
187c0 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
187d0 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
187e0 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
187f0 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
18800 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
18810 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
18820 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
18830 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
18840 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
18850 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
18860 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
18870 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
18880 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
18890 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
188a0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
188b0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
188c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
188d0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
188e0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
188f0 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
18900 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
18910 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
18920 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
18930 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
18940 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
18950 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
18960 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
18970 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
18980 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
18990 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
189a0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
189b0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
189c0 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
189d0 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
189e0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
189f0 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
18a00 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
18a10 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
18a20 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
18a30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
18a40 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
18a50 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
18a60 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
18a70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18a80 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
18a90 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
18aa0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
18ab0 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
18ac0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
18ad0 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
18ae0 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
18af0 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
18b00 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
18b10 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
18b20 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
18b30 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
18b40 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
18b50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18b60 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
18b70 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
18b80 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
18b90 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
18ba0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
18bb0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
18bc0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
18bd0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
18be0 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
18bf0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
18c00 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
18c10 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
18c20 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
18c30 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
18c40 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
18c50 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
18c60 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
18c70 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
18c80 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
18c90 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
18ca0 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
18cb0 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
18cc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
18cd0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
18ce0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
18cf0 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
18d00 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
18d10 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
18d20 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
18d30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
18d40 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
18d50 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
18d60 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
18d70 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
18d80 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
18d90 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
18da0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
18db0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
18dc0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
18dd0 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
18de0 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
18df0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
18e00 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
18e10 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
18e20 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
18e30 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
18e40 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
18e50 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
18e60 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
18e70 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
18e80 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
18e90 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
18ea0 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
18eb0 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
18ec0 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
18ed0 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
18ee0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
18ef0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
18f00 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
18f10 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
18f20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
18f30 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
18f40 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
18f50 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
18f60 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
18f70 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
18f80 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
18f90 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
18fa0 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
18fb0 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
18fc0 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
18fd0 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
18fe0 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
18ff0 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
19000 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
19010 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
19020 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
19030 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
19040 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
19050 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
19060 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
19070 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
19080 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
19090 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
190a0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
190b0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
190c0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
190d0 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
190e0 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
190f0 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
19100 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
19110 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
19120 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
19130 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
19140 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
19150 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
19160 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19170 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19180 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
19190 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
191a0 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
191b0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
191c0 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
191d0 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
191e0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
191f0 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
19200 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
19210 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
19220 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
19230 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
19240 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
19250 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
19260 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
19270 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
19280 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
19290 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
192a0 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
192b0 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
192c0 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
192d0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
192e0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
192f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
19300 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
19310 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
19320 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
19330 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fc])..**.** In t
19340 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
19350 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
19360 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
19370 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
19380 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
19390 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
193a0 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
193b0 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
193c0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
193d0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
193e0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
193f0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
19400 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
19410 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
19420 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
19430 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
19440 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19450 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
19460 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
19470 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
19480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
19490 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
194a0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
194b0 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
194c0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
194d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
194e0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
194f0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
19500 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
19510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
19520 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
19530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19540 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
19550 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
19560 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
19570 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
19580 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
19590 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
195a0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
195b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
195c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
195d0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
195e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
195f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
19600 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
19610 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
19620 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
19630 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
19640 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
19650 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
19660 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
19670 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
19680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
19690 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
196a0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
196b0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
196c0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
196d0 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
196e0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
196f0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
19700 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
19710 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
19720 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
19730 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
19740 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
19750 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
19760 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
19770 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
19780 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
19790 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
197a0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
197b0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
197c0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
197d0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
197e0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
197f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19800 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
19810 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
19820 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
19830 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
19840 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
19850 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19870 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
19880 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
198b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
198c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
198d0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
198e0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
198f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19900 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
19910 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
19920 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
19930 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
19940 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
19950 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
19960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
19970 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
19980 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
19990 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
199a0 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
199b0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
199c0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
199d0 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
199e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
199f0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
19a00 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
19a10 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
19a20 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
19a30 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
19a40 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
19a50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
19a60 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
19a70 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
19a80 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
19a90 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
19aa0 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
19ab0 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
19ac0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19ad0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19ae0 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
19af0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
19b00 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
19b10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19b20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19b30 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
19b40 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
19b50 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
19b60 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
19b70 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
19b80 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
19b90 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
19ba0 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
19bb0 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
19bc0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
19bd0 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
19be0 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
19bf0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
19c00 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
19c10 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
19c20 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
19c30 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
19c40 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
19c50 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
19c60 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
19c70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
19c80 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
19c90 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
19ca0 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
19cb0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19cc0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
19cd0 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19cf0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
19d00 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19d10 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
19d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d40 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
19d50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69   */.  if( p->pRi
19d60 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d  ghtmost && pSub-
19d70 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
19d80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
19dc0 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
19dd0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
19de0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
19df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
19e10 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
19e20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
19e30 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
19e40 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
19e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
19e60 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
19e70 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
19e80 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
19e90 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
19ea0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
19eb0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19ec0 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
19ed0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
19ee0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
19ef0 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
19f00 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
19f10 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
19f20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19f30 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
19f40 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
19f50 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
19f60 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
19f70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
19fb0 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
19fc0 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
19fd0 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
19fe0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19ff0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a000 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1a010 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1a020 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1a030 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1a040 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a050 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1a060 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1a070 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1a080 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1a090 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1a0a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1a0b0 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1a0c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1a0d0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1a0e0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1a0f0 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1a100 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1a110 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1a120 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1a130 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1a140 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1a150 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1a160 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1a170 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1a180 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1a190 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1a1a0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1a1b0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1a1c0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1a1d0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1a1e0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1a1f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1a200 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1a210 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1a220 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1a230 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1a240 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1a250 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1a260 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1a270 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1a280 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1a290 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1a2a0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1a2b0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1a2c0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1a2d0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1a2e0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1a2f0 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1a300 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1a310 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1a320 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1a330 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1a340 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1a350 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1a360 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1a370 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1a380 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1a390 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1a3a0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1a3b0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1a3c0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1a3d0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1a3e0 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1a3f0 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1a400 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1a410 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1a420 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1a430 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1a440 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1a450 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1a460 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1a470 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1a480 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1a490 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1a4a0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1a4b0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1a4c0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1a4d0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1a4e0 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1a4f0 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1a500 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1a510 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1a520 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1a530 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1a540 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1a550 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1a560 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
1a570 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1a580 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1a590 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
1a5a0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1a5b0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1a5c0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1a5d0 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1a5e0 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1a5f0 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1a600 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1a610 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1a620 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1a630 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1a640 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1a650 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1a660 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1a670 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1a680 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1a690 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1a6a0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1a6b0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1a6c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1a6d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1a6e0 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1a6f0 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1a700 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1a710 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1a720 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1a730 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a740 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1a750 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1a760 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1a770 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1a780 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1a790 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1a7a0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1a7b0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1a7c0 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1a7d0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1a7e0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1a7f0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1a800 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1a810 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1a820 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1a830 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
1a840 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1a850 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1a860 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1a870 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1a880 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1a890 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1a8a0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1a8b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1a8c0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70        || pSub->p
1a8d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53  EList->nExpr!=pS
1a8e0 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1a8f0 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  pr.      ){.    
1a900 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a910 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1a920 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1a930 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1a940 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1a950 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1a960 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1a970 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1a980 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1a990 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1a9a0 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1a9b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1a9c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1a9d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1a9e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1a9f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1aa00 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1aa10 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1aa20 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1aa30 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1aa40 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
1aa50 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
1aa60 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
1aa70 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
1aa80 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
1aa90 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
1aaa0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1aab0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1aac0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
1aad0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
1aae0 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
1aaf0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1ab00 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
1ab10 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
1ab20 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1ab30 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1ab40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1ab50 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
1ab60 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
1ab70 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
1ab80 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
1ab90 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
1aba0 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
1abb0 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
1abc0 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
1abd0 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
1abe0 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
1abf0 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
1ac00 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
1ac10 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
1ac20 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1ac30 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
1ac40 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
1ac50 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
1ac60 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
1ac70 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
1ac80 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
1ac90 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
1aca0 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
1acb0 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
1acc0 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
1acd0 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
1ace0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
1acf0 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
1ad00 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
1ad10 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
1ad20 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
1ad30 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
1ad40 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
1ad50 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
1ad60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
1ad70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
1ad80 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
1ad90 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
1ada0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
1adb0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1adc0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1add0 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
1ade0 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
1adf0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1ae00 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
1ae10 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
1ae20 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
1ae30 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
1ae40 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
1ae50 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
1ae60 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1ae70 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
1ae80 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
1ae90 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1aea0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1aeb0 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
1aec0 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
1aed0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1aee0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
1aef0 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
1af00 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
1af10 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
1af20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1af30 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
1af40 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
1af50 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1af60 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
1af70 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
1af80 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
1af90 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1afa0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
1afb0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
1afc0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1afd0 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
1afe0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
1aff0 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  it;.    Expr *pO
1b000 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
1b010 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  et;.    Select *
1b020 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1b030 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
1b040 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
1b050 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
1b060 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
1b070 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1b080 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1b090 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
1b0a0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1b0b0 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  db, p, 0);.    p
1b0c0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
1b0d0 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  set;.    p->pLim
1b0e0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
1b0f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1b100 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
1b110 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
1b120 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
1b130 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f  .    p->pRightmo
1b140 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  st = 0;.    if( 
1b150 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1b160 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a   pNew = pPrior;.
1b170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b180 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1b190 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e  pPrior;.      pN
1b1a0 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
1b1b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
1b1c0 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
1b1d0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1b1e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1b1f0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1b200 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1b210 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1b220 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1b230 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1b240 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1b250 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1b260 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1b270 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1b280 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1b290 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1b2a0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1b2b0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1b2c0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1b2d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1b2e0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1b2f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1b300 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1b310 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1b320 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1b330 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1b340 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1b350 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1b360 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1b370 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1b380 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1b390 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1b3a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1b3b0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1b3c0 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1b3d0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1b3e0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1b3f0 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1b400 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1b410 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1b420 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1b430 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1b440 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1b450 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1b460 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1b470 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1b480 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1b490 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1b4a0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1b4b0 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1b4c0 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1b4d0 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1b4e0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1b4f0 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1b500 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1b510 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1b520 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1b530 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1b540 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1b550 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1b560 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1b570 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1b580 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1b590 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1b5a0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1b5b0 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1b5c0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1b5d0 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1b5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b5f0 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1b600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1b610 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1b620 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1b630 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1b640 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1b650 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1b660 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1b670 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1b680 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1b690 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1b6a0 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1b6b0 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1b6c0 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1b6d0 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1b6e0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1b6f0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1b700 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1b710 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1b720 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1b730 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1b740 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1b750 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1b760 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1b770 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1b780 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1b790 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1b7a0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1b7b0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1b7c0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1b7d0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1b7e0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1b7f0 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1b800 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1b810 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1b820 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1b830 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1b840 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1b850 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1b860 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1b870 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1b880 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1b890 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1b8a0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1b8b0 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1b8c0 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1b8d0 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1b8e0 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1b8f0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1b900 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1b910 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1b920 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1b930 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1b940 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1b950 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1b960 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1b970 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1b980 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1b990 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1b9a0 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1b9b0 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1b9c0 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1b9d0 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1b9e0 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1b9f0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1ba00 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1ba10 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1ba20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ba30 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1ba40 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1ba50 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1ba60 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1ba70 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1ba80 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1ba90 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1baa0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1bab0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1bac0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1bad0 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1bae0 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1baf0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1bb00 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1bb10 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1bb20 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1bb30 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1bb40 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1bb50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1bb60 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1bb70 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1bb80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1bb90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1bba0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1bbb0 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1bbc0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1bbd0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1bbe0 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1bbf0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1bc00 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1bc10 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1bc20 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1bc30 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1bc40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1bc50 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1bc60 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1bc70 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1bc80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1bc90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1bca0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1bcb0 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1bcc0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1bcd0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1bce0 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1bcf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1bd00 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1bd10 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1bd20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1bd30 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1bd40 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1bd50 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1bd60 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1bd70 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1bd80 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1bd90 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1bda0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1bdb0 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1bdc0 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1bdd0 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1bde0 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1bdf0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1be00 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1be10 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1be20 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1be30 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1be40 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1be50 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1be60 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1be70 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1be80 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1be90 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1bea0 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1beb0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1bec0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1bed0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1bee0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1bef0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1bf00 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1bf10 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1bf20 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1bf30 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1bf40 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1bf50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1bf60 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1bf70 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1bf80 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1bf90 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1bfa0 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1bfb0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1bfc0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1bfd0 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1bfe0 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1bff0 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1c000 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1c010 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1c020 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1c030 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1c040 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1c050 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1c060 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1c070 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1c080 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1c090 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1c0a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1c0b0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1c0c0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1c0d0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1c0e0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1c0f0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1c100 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1c110 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1c120 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1c130 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1c140 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1c150 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1c160 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1c170 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1c180 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1c190 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1c1a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c1b0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1c1c0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1c1d0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1c1e0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1c1f0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1c200 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1c210 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1c220 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1c230 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1c240 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1c250 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1c260 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1c270 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1c280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1c290 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1c2a0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1c2b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1c2c0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1c2d0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1c2e0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1c2f0 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1c300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c310 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1c320 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1c330 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1c340 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1c350 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1c360 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1c370 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
1c380 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1c390 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
1c3a0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1c3b0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1c3c0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
1c3d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1c3e0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1c3f0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1c400 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1c410 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1c420 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1c430 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1c440 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1c450 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
1c460 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
1c470 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
1c480 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1c490 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
1c4a0 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
1c4b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1c4c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1c4d0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
1c4e0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1c4f0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1c500 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
1c510 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1c520 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1c530 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
1c540 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
1c550 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1c560 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
1c570 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1c580 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1c590 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1c5a0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1c5b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c5c0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1c5d0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
1c5e0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1c5f0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1c600 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1c610 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
1c620 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1c630 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1c640 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1c650 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1c660 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c670 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1c680 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1c690 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1c6a0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1c6b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1c6e0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1c6f0 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
1c700 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1c710 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
1c720 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1c730 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1c740 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1c750 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
1c760 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1c770 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1c780 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1c790 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1c7a0 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
1c7b0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1c7c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c7d0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1c7e0 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1c7f0 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
1c800 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
1c810 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
1c820 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
1c830 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
1c840 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
1c850 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1c860 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
1c870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1c880 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
1c890 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1c8a0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
1c8b0 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
1c8c0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1c8d0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
1c8e0 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
1c8f0 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
1c900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
1c910 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
1c920 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
1c930 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
1c940 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
1c950 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
1c960 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
1c970 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
1c980 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
1c990 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1c9a0 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
1c9b0 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
1c9c0 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
1c9d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
1c9e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
1c9f0 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
1ca00 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
1ca10 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1ca20 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
1ca30 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
1ca40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ca50 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
1ca60 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
1ca70 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1ca80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1ca90 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1caa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cab0 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
1cac0 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
1cad0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
1cae0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
1caf0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1cb00 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
1cb10 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
1cb20 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
1cb30 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1cb40 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
1cb50 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
1cb60 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
1cb70 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1cb80 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
1cb90 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1cba0 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
1cbb0 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
1cbc0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
1cbd0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
1cbe0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1cbf0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
1cc00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
1cc10 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
1cc20 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
1cc30 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1cc40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1cc50 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
1cc60 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
1cc70 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
1cc80 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
1cc90 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
1cca0 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
1ccb0 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
1ccc0 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
1ccd0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
1cce0 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
1ccf0 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
1cd00 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
1cd10 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
1cd20 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
1cd30 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
1cd40 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1cd50 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
1cd60 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1cd70 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
1cd80 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
1cd90 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1cda0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
1cdb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1cdc0 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
1cdd0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
1cde0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1cdf0 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
1ce00 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
1ce10 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
1ce20 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
1ce30 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
1ce40 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1ce50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1ce60 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
1ce70 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
1ce80 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
1ce90 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1cea0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1ceb0 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
1cec0 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
1ced0 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
1cee0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
1cef0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1cf00 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1cf10 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
1cf20 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1cf30 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1cf40 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
1cf50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1cf60 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1cf70 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
1cf80 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1cf90 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
1cfa0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
1cfb0 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
1cfc0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
1cfd0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
1cfe0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
1cff0 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
1d000 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
1d010 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1d020 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
1d030 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
1d040 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
1d050 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
1d060 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
1d070 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1d080 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1d090 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
1d0a0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
1d0b0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1d0c0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
1d0d0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
1d0e0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
1d0f0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1d100 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
1d110 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
1d120 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
1d130 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1d140 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
1d150 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
1d160 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
1d170 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
1d180 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
1d190 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
1d1a0 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
1d1b0 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
1d1c0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
1d1d0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
1d1e0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
1d1f0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1d200 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
1d210 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
1d220 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
1d230 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
1d240 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1d250 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1d260 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
1d270 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
1d280 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
1d290 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
1d2a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1d2b0 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
1d2c0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
1d2d0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
1d2e0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1d2f0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
1d300 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1d310 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
1d320 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1d330 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
1d340 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
1d350 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
1d360 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
1d370 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
1d380 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1d390 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1d3a0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1d3b0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
1d3c0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1d3d0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
1d3e0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
1d3f0 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
1d400 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
1d410 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
1d420 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1d430 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
1d440 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
1d450 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
1d460 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
1d470 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
1d480 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
1d490 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
1d4a0 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
1d4b0 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
1d4c0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1d4d0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
1d4e0 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
1d4f0 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
1d500 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
1d510 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
1d520 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
1d530 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
1d540 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
1d550 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
1d560 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
1d570 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
1d580 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
1d590 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1d5a0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
1d5b0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
1d5c0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
1d5d0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
1d5e0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
1d5f0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
1d600 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e  ab && pFrom->zIn
1d610 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dex ){.    Table
1d620 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1d630 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
1d640 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e  zIndex = pFrom->
1d650 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65  zIndex;.    Inde
1d660 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1d670 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1d680 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
1d690 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
1d6a0 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
1d6b0 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20   zIndex); .     
1d6c0 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
1d6d0 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
1d6e0 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
1d6f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1d700 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1d710 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
1d720 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20  Index, 0);.     
1d730 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1d740 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
1d750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d760 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
1d770 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70  From->pIndex = p
1d780 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
1d790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
1d7a0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
1d7b0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
1d7c0 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
1d7d0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1d7e0 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
1d7f0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
1d800 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
1d810 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
1d820 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
1d830 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
1d840 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
1d850 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
1d860 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
1d870 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
1d880 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
1d890 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
1d8a0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1d8b0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
1d8c0 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
1d8d0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
1d8e0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
1d8f0 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
1d900 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
1d910 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
1d920 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1d930 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
1d940 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
1d950 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
1d960 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1d970 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
1d980 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
1d990 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
1d9a0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
1d9b0 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
1d9c0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
1d9d0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
1d9e0 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
1d9f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1da00 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
1da10 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
1da20 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
1da30 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
1da40 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
1da50 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
1da60 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
1da70 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
1da80 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
1da90 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1daa0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
1dab0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1dac0 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
1dad0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
1dae0 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
1daf0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
1db00 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
1db10 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
1db20 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
1db30 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
1db40 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
1db50 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
1db60 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
1db70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
1db80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1db90 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
1dba0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
1dbb0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
1dbc0 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
1dbd0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
1dbe0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1dbf0 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
1dc00 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
1dc10 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1dc20 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
1dc30 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
1dc40 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
1dc50 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
1dc60 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
1dc70 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
1dc80 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1dc90 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
1dca0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
1dcb0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1dcc0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
1dcd0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
1dce0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
1dcf0 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
1dd00 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
1dd10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1dd20 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
1dd30 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1dd40 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
1dd50 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
1dd60 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
1dd70 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
1dd80 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1dd90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1dda0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
1ddb0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1ddc0 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
1ddd0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
1dde0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1ddf0 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
1de00 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
1de10 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
1de20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1de30 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
1de40 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
1de50 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
1de60 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
1de70 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
1de80 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
1de90 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
1dea0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
1deb0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1dec0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1ded0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
1dee0 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20  xpr(db, TK_ALL, 
1def0 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
1df00 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
1df10 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
1df20 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
1df30 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
1df40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
1df50 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
1df60 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1df70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
1df80 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
1df90 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
1dfa0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
1dfb0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
1dfc0 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 50 61  e *searchWith(Pa
1dfd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
1dfe0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1dff0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a   *p){.  if( p->z
1e000 44 61 74 61 62 61 73 65 3d 3d 30 20 29 7b 0a 20  Database==0 ){. 
1e010 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1e020 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 57   p->zName;.    W
1e030 69 74 68 20 2a 70 57 69 74 68 3b 0a 0a 20 20 20  ith *pWith;..   
1e040 20 66 6f 72 28 70 57 69 74 68 3d 70 50 61 72 73   for(pWith=pPars
1e050 65 2d 3e 70 57 69 74 68 3b 20 70 57 69 74 68 3b  e->pWith; pWith;
1e060 20 70 57 69 74 68 3d 70 57 69 74 68 2d 3e 70 4f   pWith=pWith->pO
1e070 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
1e080 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
1e090 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
1e0a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e0b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1e0c0 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
1e0d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
1e0e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1e0f0 75 72 6e 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  urn &pWith->a[i]
1e100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e110 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e120 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69  return 0;.}..voi
1e130 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
1e140 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1e150 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
1e160 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
1e170 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
1e180 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
1e190 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
1e1a0 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  th = pWith;.  }.
1e1b0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
1e1c0 74 68 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  thPop(Parse *pPa
1e1d0 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
1e1e0 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
1e1f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e200 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
1e210 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  th );.    pParse
1e220 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d  ->pWith = pWith-
1e230 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 0a  >pOuter;.  }.}..
1e240 73 74 61 74 69 63 20 69 6e 74 20 63 74 65 50 75  static int ctePu
1e250 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
1e260 2c 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43  , struct Cte *pC
1e270 74 65 29 7b 0a 20 20 69 66 28 20 70 43 74 65 20  te){.  if( pCte 
1e280 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 43 74  ){.    struct Ct
1e290 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  e *p;.    for(p=
1e2a0 70 50 61 72 73 65 2d 3e 70 43 74 65 3b 20 70 3b  pParse->pCte; p;
1e2b0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 43 74 65 29   p=p->pOuterCte)
1e2c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d 70  {.      if( p==p
1e2d0 43 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Cte ){.        s
1e2e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
1e300 73 65 2c 20 22 69 6c 6c 65 67 61 6c 20 72 65 63  se, "illegal rec
1e310 75 72 73 69 76 65 20 64 65 66 69 6e 69 6e 69 74  ursive defininit
1e320 69 6f 6e 20 69 6e 20 63 74 65 3a 20 25 73 22 2c  ion in cte: %s",
1e330 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
1e340 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1e350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1e360 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
1e370 20 7d 0a 20 20 20 20 0a 20 20 20 20 70 43 74 65   }.    .    pCte
1e380 2d 3e 70 4f 75 74 65 72 43 74 65 20 3d 20 70 50  ->pOuterCte = pP
1e390 61 72 73 65 2d 3e 70 43 74 65 3b 0a 20 20 20 20  arse->pCte;.    
1e3a0 70 50 61 72 73 65 2d 3e 70 43 74 65 20 3d 20 70  pParse->pCte = p
1e3b0 43 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Cte;.  }.  retur
1e3c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e3d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 65 50  static void cteP
1e3e0 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
1e3f0 2c 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43  , struct Cte *pC
1e400 74 65 29 7b 0a 20 20 69 66 28 20 70 43 74 65 20  te){.  if( pCte 
1e410 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e420 50 61 72 73 65 2d 3e 70 43 74 65 3d 3d 70 43 74  Parse->pCte==pCt
1e430 65 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  e );.    pParse-
1e440 3e 70 43 74 65 20 3d 20 70 43 74 65 2d 3e 70 4f  >pCte = pCte->pO
1e450 75 74 65 72 43 74 65 3b 0a 20 20 7d 0a 7d 0a 0a  uterCte;.  }.}..
1e460 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
1e470 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
1e480 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
1e490 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e4a0 20 2a 70 46 72 6f 6d 2c 0a 20 20 73 74 72 75 63   *pFrom,.  struc
1e4b0 74 20 43 74 65 20 2a 70 43 74 65 0a 29 7b 0a 20  t Cte *pCte.){. 
1e4c0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1e4d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1e4e0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1e4f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e500 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1e510 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1e520 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 61  Select==0 );.  a
1e530 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1e540 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ab==0 );..  if( 
1e550 70 43 74 65 3d 3d 70 50 61 72 73 65 2d 3e 70 43  pCte==pParse->pC
1e560 74 65 20 26 26 20 28 70 54 61 62 20 3d 20 70 43  te && (pTab = pC
1e570 74 65 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  te->pTab) ){.   
1e580 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
1e590 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
1e5a0 66 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  f a recursive CT
1e5b0 45 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E */.    pFrom->
1e5c0 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
1e5d0 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
1e5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
1e5f0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1e600 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
1e610 20 20 20 20 69 6e 74 20 62 52 65 63 75 72 73 69      int bRecursi
1e620 76 65 3b 0a 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  ve;..    pFrom->
1e630 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
1e640 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1e650 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
1e660 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
1e670 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1e680 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
1e690 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
1e6a0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
1e6b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1e6c0 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
1e6d0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
1e6e0 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
1e6f0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
1e700 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35  >nRowEst = 10485
1e710 37 36 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61  76;.    pTab->ta
1e720 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
1e730 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f  emeral;.    pFro
1e740 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
1e750 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1e760 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
1e770 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
1e780 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e7a0 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  MEM;.    assert(
1e7b0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
1e7c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 63 74 65 50  );..    if( cteP
1e7d0 75 73 68 28 70 50 61 72 73 65 2c 20 70 43 74 65  ush(pParse, pCte
1e7e0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
1e7f0 62 6f 72 74 3b 0a 20 20 20 20 70 53 65 6c 20 3d  bort;.    pSel =
1e800 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1e810 0a 20 20 20 20 62 52 65 63 75 72 73 69 76 65 20  .    bRecursive 
1e820 3d 20 28 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f  = (pSel->op==TK_
1e830 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
1e840 3d 54 4b 5f 55 4e 49 4f 4e 29 3b 0a 20 20 20 20  =TK_UNION);.    
1e850 69 66 28 20 62 52 65 63 75 72 73 69 76 65 20 29  if( bRecursive )
1e860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e870 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 3b 0a  pSel->pPrior );.
1e880 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1e890 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1e8a0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 29 3b 0a   pSel->pPrior);.
1e8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1e8d0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
1e8e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1e8f0 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
1e900 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
1e910 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
1e920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65   }else{.      Se
1e930 6c 65 63 74 20 2a 70 4c 65 66 74 3b 0a 20 20 20  lect *pLeft;.   
1e940 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
1e950 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
1e960 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
1e970 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 45  Prior);.      pE
1e980 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
1e990 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  List;.    }.    
1e9a0 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
1e9b0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1e9c0 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
1e9d0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1e9e0 6f 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 52  ol);..    if( bR
1e9f0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
1ea00 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 54 61    int nRef = pTa
1ea10 62 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 70  b->nRef;.      p
1ea20 43 74 65 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  Cte->pTab = pTab
1ea30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
1ea40 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1ea50 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  r, pSel);.      
1ea60 70 43 74 65 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  pCte->pTab = 0;.
1ea70 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
1ea80 6e 52 65 66 20 3e 20 6e 52 65 66 29 7b 0a 20 20  nRef > nRef){.  
1ea90 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 52 65 63        pSel->pRec
1eaa0 75 72 73 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  urse = pTab;.   
1eab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
1eac0 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 3b 0a 20 20  b->tnum==0 );.  
1ead0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1eae0 20 63 74 65 50 6f 70 28 70 50 61 72 73 65 2c 20   ctePop(pParse, 
1eaf0 70 43 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pCte);.  }..  re
1eb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eb10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1eb20 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
1eb30 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
1eb40 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
1eb50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1eb60 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
1eb70 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
1eb80 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1eb90 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
1eba0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ebb0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
1ebc0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
1ebd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
1ebe0 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
1ebf0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1ec00 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
1ec10 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
1ec20 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
1ec30 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1ec40 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
1ec50 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
1ec60 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
1ec70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
1ec80 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
1ec90 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
1eca0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
1ecb0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1ecc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ecd0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
1ece0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
1ecf0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
1ed00 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
1ed10 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
1ed20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1ed30 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
1ed40 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
1ed50 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
1ed60 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
1ed70 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
1ed80 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
1ed90 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
1eda0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
1edb0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
1edc0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
1edd0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
1ede0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
1edf0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
1ee00 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
1ee10 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
1ee20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
1ee30 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1ee40 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
1ee50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
1ee60 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
1ee70 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1ee80 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
1ee90 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
1eea0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
1eeb0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
1eec0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
1eed0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
1eee0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
1eef0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
1ef00 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
1ef10 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
1ef20 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
1ef30 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
1ef40 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1ef50 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
1ef60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ef70 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
1ef80 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1ef90 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
1efa0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
1efb0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
1efc0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
1efd0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1efe0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1eff0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1f000 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
1f010 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1f020 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1f030 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
1f040 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
1f050 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
1f060 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
1f070 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
1f080 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
1f090 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f0a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1f0b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
1f0c0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
1f0d0 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
1f0e0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1f0f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1f100 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1f110 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
1f120 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1f130 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1f140 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
1f150 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
1f160 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
1f170 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
1f180 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
1f190 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
1f1a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1f1b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
1f1c0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1f1d0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
1f1e0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
1f1f0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
1f200 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
1f210 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1f220 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
1f230 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1f240 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
1f250 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
1f260 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
1f270 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
1f280 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
1f290 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1f2a0 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
1f2b0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1f2c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
1f2d0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1f2e0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1f2f0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1f300 7b 0a 20 20 20 20 73 74 72 75 63 74 20 43 74 65  {.    struct Cte
1f310 20 2a 70 43 74 65 20 3d 20 30 3b 0a 20 20 20 20   *pCte = 0;.    
1f320 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1f330 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1f340 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1f350 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1f360 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f370 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1f380 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1f390 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1f3a0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1f3b0 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1f3c0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1f3d0 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  une;.    }.#ifnd
1f3e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1f3f0 54 45 0a 20 20 20 20 70 43 74 65 20 3d 20 73 65  TE.    pCte = se
1f400 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2c  archWith(pParse,
1f410 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28   pFrom);.    if(
1f420 20 70 43 74 65 20 29 7b 0a 20 20 20 20 20 20 69   pCte ){.      i
1f430 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
1f440 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2c 20 70 43  alker, pFrom, pC
1f450 74 65 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  te) ) return WRC
1f460 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73  _Abort;.    }els
1f470 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
1f480 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
1f490 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1f4a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f4b0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1f4c0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1f4d0 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
1f4e0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1f4f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f500 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1f510 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
1f520 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1f530 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1f540 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f550 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1f560 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
1f570 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1f580 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
1f590 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1f5a0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
1f5b0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1f5c0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1f5d0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1f5e0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
1f5f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
1f600 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1f610 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
1f620 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
1f630 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1f640 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
1f650 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
1f660 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
1f670 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
1f680 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
1f690 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
1f6a0 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
1f6b0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
1f6c0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
1f6d0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45       pTab->nRowE
1f6e0 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20  st = 1048576;.  
1f6f0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1f700 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
1f710 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
1f720 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1f730 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
1f740 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
1f750 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f760 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1f770 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1f780 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
1f790 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1f7a0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1f7b0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
1f7c0 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
1f7d0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
1f7e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1f7f0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
1f800 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20  Ref==0xffff ){. 
1f810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1f820 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f830 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e  too many referen
1f840 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d  ces to \"%s\": m
1f850 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20  ax 65535",.     
1f860 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1f870 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f  e);.        pFro
1f880 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
1f890 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1f8a0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
1f8b0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
1f8c0 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
1f8d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1f8e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
1f8f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1f900 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
1f910 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1f920 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
1f930 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
1f940 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
1f950 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
1f960 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
1f970 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
1f980 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
1f990 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
1f9a0 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
1f9b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1f9c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f9d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
1f9e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46  =0 );.        pF
1f9f0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
1fa00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1fa10 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
1fa20 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
1fa30 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1fa40 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
1fa50 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
1fa60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1fa70 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
1fa80 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
1fa90 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
1faa0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
1fab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1fac0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1fad0 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
1fae0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1faf0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1fb00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
1fb10 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
1fb20 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
1fb30 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
1fb40 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
1fb50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1fb60 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
1fb70 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
1fb80 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
1fb90 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1fba0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
1fbb0 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
1fbc0 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
1fbd0 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
1fbe0 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
1fbf0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1fc00 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
1fc10 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
1fc20 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
1fc30 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
1fc40 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
1fc50 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
1fc60 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
1fc70 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
1fc80 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
1fc90 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
1fca0 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
1fcb0 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
1fcc0 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
1fcd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
1fce0 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
1fcf0 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
1fd00 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
1fd10 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
1fd20 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
1fd30 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1fd40 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
1fd50 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
1fd60 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
1fd70 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
1fd80 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
1fd90 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
1fda0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
1fdb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
1fdc0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1fdd0 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
1fde0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
1fdf0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
1fe00 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1fe10 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
1fe20 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1fe30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
1fe40 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1fe50 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1fe60 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
1fe70 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
1fe80 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
1fe90 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1fea0 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
1feb0 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  t->op==TK_ALL ) 
1fec0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1fed0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1fee0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1fef0 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
1ff00 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
1ff10 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
1ff20 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
1ff30 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
1ff40 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
1ff50 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
1ff60 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
1ff70 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1ff80 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1ff90 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
1ffa0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
1ffb0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
1ffc0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1ffd0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
1ffe0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
1fff0 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
20000 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
20010 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
20020 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
20030 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
20040 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
20070 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
20080 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
20090 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73   /* When process
200a0 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ing FROM-clause 
200b0 73 75 62 71 75 65 72 69 65 73 2c 20 69 74 20 69  subqueries, it i
200c0 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
200d0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75  e.    ** that fu
200e0 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d  ll_column_names=
200f0 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f  OFF and short_co
20100 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20  lumn_names=ON.  
20110 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  The.    ** sqlit
20120 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
20130 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61  ect() routine ma
20140 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20  kes it so. */.  
20150 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
20160 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
20170 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20  edFrom)==0.     
20180 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20       || ((flags 
20190 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
201a0 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20  Names)==0 &&.   
201b0 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
201c0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
201d0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b  ColNames)!=0) );
201e0 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
201f0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
20200 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d  k++){.      pE =
20210 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
20220 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e     pRight = pE->
20230 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
20240 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
20250 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d  _DOT || pRight!=
20260 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
20270 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
20280 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
20290 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
202a0 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
202b0 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
202c0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
202d0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
202e0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
202f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20300 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
20310 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
20320 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
20330 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
20340 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
20350 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
20360 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
20370 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
20380 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
20390 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
203a0 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
203b0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
203c0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
203d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
203e0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
203f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
20400 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
20410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20420 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
20430 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
20440 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
20450 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
20460 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
20470 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
20480 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
20490 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
204a0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
204b0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
204c0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
204d0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
204e0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
204f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
20500 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
20510 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
20520 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
20530 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
20540 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20550 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
20560 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
20570 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
20580 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
20590 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
205a0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
205b0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
205c0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
205d0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
205e0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
205f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
20600 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
20610 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
20620 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
20630 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
20640 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
20650 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
20660 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
20670 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
20680 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
20690 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
206a0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
206b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
206c0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
206d0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
206e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
206f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
20700 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
20710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
20720 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
20730 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
20740 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
20750 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
20760 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
20770 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
20780 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
20790 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
207a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
207b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
207c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
207d0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
207e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
207f0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
20800 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
20810 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
20820 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
20830 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20  Db[iDb].zName : 
20840 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "*";.          }
20850 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
20860 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
20870 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
20880 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
20890 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
208a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
208b0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
208c0 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
208d0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
208e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
208f0 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
20900 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
20910 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
20920 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
20930 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
20940 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
20950 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
20960 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
20970 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
20980 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20  ert( zName );.  
20990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
209a0 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20  Name && pSub.   
209b0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
209c0 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
209d0 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  e(pSub->pEList->
209e0 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a  a[j].zSpan, 0, z
209f0 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20  TName, 0)==0.   
20a00 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
20a10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
20a20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
20a30 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  }..            /
20a40 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
20a50 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
20a60 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f  en' (currently o
20a70 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  nly possible.   
20a80 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
20a90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c  virtual tables),
20aa0 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
20ab0 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  it in the expand
20ac0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
20ad0 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
20ae0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
20af0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
20b00 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
20b10 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
20b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20b30 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75    assert(IsVirtu
20b40 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20  al(pTab));.     
20b50 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
20b60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
20b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
20b80 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
20b90 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
20ba0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
20bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20bc0 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74  f( (pFrom->joint
20bd0 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
20be0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
20bf0 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
20c00 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
20c10 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
20c20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
20c30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20c40 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
20c50 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
20c60 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
20c70 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20c90 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
20ca0 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
20cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
20cc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
20cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
20cf0 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
20d00 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
20d10 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d30 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
20d40 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
20d50 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
20d60 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
20d70 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
20d80 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
20d90 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
20da0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
20db0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20dc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20dd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20de0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
20df0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
20e00 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
20e10 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
20e20 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
20e30 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
20e40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
20e50 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
20e60 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
20e70 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
20e80 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
20e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20ea0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
20eb0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
20ec0 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
20ed0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
20ee0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
20ef0 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
20f00 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20f20 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
20f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f40 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
20f50 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
20f60 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
20f80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
20f90 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
20fa0 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c  T, pLeft, pExpr,
20fb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20fd0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
20fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20ff0 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
21000 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
21010 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
21020 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
21040 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
21050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21060 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
21070 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21080 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
21090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
210a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
210b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
210c0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
210d0 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
210e0 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
210f0 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65  ame.z = zColname
21100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
21110 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74  olname.n = sqlit
21120 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e  e3Strlen30(zColn
21130 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
21140 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
21150 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
21160 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
21170 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21180 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
21190 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
211a0 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
211b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
211c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
211d0 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
211e0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
211f0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
21200 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
21220 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
21230 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
21240 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
21250 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
21260 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21270 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
21280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
212a0 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
212b0 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
212c0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
212d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
21300 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
21310 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
21340 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
21350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21360 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
21370 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
21380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21390 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
213a0 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
213b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
213c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213d0 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
213e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
213f0 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
21400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21410 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
21420 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
21430 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
21440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21460 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21470 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
21480 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
21490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
214a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
214b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
214c0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
214d0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
214e0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
214f0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
21500 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
21510 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
21520 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
21530 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
21540 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
21550 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21560 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
21570 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
21580 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65  lt set");.  }.#e
21590 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
215a0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 73  C_Continue;.}..s
215b0 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
215c0 45 78 70 61 6e 64 65 72 57 69 74 68 28 57 61 6c  ExpanderWith(Wal
215d0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
215e0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
215f0 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 57 69  res;.  sqlite3Wi
21600 74 68 50 75 73 68 28 70 57 61 6c 6b 65 72 2d 3e  thPush(pWalker->
21610 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
21620 29 3b 0a 20 20 72 65 73 20 3d 20 73 65 6c 65 63  );.  res = selec
21630 74 45 78 70 61 6e 64 65 72 28 70 57 61 6c 6b 65  tExpander(pWalke
21640 72 2c 20 70 29 3b 0a 20 20 77 69 74 68 50 6f 70  r, p);.  withPop
21650 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
21660 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 72  , p->pWith);.  r
21670 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
21680 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
21690 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
216a0 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
216b0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
216c0 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
216d0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
216e0 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
216f0 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
21700 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
21710 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
21720 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
21730 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
21740 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
21750 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
21760 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
21770 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
21780 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
21790 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
217a0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
217b0 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
217c0 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
217d0 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
217e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
217f0 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
21800 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
21810 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
21820 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
21830 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
21840 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
21850 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
21860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21870 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
21880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
21890 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
218a0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
218b0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
218c0 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
218d0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
218e0 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
218f0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
21900 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
21910 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
21920 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
21930 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
21940 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
21950 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
21960 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
21970 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
21980 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
21990 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
219a0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
219b0 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
219c0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
219d0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
219e0 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
219f0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
21a00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
21a10 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
21a20 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
21a30 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
21a40 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
21a50 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
21a60 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
21a70 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
21a80 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
21a90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
21aa0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
21ab0 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
21ac0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
21ad0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
21ae0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
21af0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
21b00 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
21b10 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
21b20 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
21b30 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61  Parse;.  if( pPa
21b40 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
21b50 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
21b60 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
21b70 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
21b80 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
21b90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
21ba0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
21bb0 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
21bc0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
21bd0 74 45 78 70 61 6e 64 65 72 57 69 74 68 3b 0a 20  tExpanderWith;. 
21be0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
21bf0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
21c00 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
21c10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
21c20 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
21c30 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
21c40 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
21c50 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
21c60 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
21c70 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
21c80 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
21c90 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
21ca0 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
21cb0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
21cc0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
21cd0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
21ce0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
21cf0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
21d00 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
21d10 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
21d20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
21d30 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
21d40 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
21d50 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
21d60 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
21d70 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
21d80 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
21d90 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
21da0 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
21db0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
21dc0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
21dd0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
21de0 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
21df0 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
21e00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
21e10 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
21e20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
21e30 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
21e40 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
21e50 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
21e60 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
21e70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21e80 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
21e90 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
21ea0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21eb0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
21ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
21ed0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
21ee0 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
21ef0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
21f00 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
21f10 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
21f20 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
21f30 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
21f40 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
21f50 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
21f60 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
21f70 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
21f80 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
21f90 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
21fa0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
21fb0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
21fc0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
21fd0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
21fe0 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
21ff0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
22000 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
22010 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
22020 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
22030 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
22040 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
22050 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
22060 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
22070 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20         if( pSel 
22080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
22090 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
220a0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
220b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
220c0 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
220d0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
220e0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
220f0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSel);.        }
22100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22110 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
22120 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64  Continue;.}.#end
22130 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
22140 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
22150 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
22160 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
22170 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
22180 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
22190 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
221a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
221b0 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
221c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
221d0 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
221e0 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
221f0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
22200 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
22210 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
22220 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
22230 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
22240 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
22250 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
22260 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
22270 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
22280 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
22290 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
222a0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
222b0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
222c0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
222d0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
222e0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
222f0 20 20 77 2e 62 53 65 6c 65 63 74 44 65 70 74 68    w.bSelectDepth
22300 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 73 71 6c  First = 1;.  sql
22310 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
22320 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
22330 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
22340 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
22350 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
22360 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
22370 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
22380 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
22390 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
223a0 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
223b0 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
223c0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
223d0 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
223e0 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
223f0 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
22400 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
22410 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
22420 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
22430 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
22440 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
22450 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
22460 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
22470 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
22480 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
22490 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
224a0 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
224b0 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
224c0 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
224d0 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
224e0 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
224f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22500 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
22510 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
22520 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
22530 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
22540 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
22550 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22560 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
22570 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
22580 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
225a0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
225b0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
225c0 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
225d0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
225e0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
225f0 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
22600 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
22610 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
22620 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
22630 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22640 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
22650 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
22660 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
22670 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
22680 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
22690 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
226a0 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
226b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
226c0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
226d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
226e0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
226f0 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
22700 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
22710 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
22720 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
22730 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
22740 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
22750 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
22760 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
22770 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
22780 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
22790 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
227a0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
227b0 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
227c0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
227d0 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
227e0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
227f0 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
22800 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
22810 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
22820 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
22830 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
22840 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
22850 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
22860 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
22870 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
22880 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
22890 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
228a0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
228b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
228c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
228d0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
228e0 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
228f0 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
22900 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
22910 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
22920 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
22930 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22940 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
22950 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
22960 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
22970 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
22980 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
22990 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
229a0 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
229b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
229c0 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
229d0 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
229e0 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
229f0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
22a00 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
22a10 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
22a20 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
22a30 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
22a40 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
22a50 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
22a60 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
22a70 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
22a80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
22a90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
22aa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
22ab0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
22ac0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
22ad0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
22ae0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
22af0 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
22b00 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
22b10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
22b20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
22b30 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
22b40 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
22b50 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
22b60 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
22b70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
22b80 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
22b90 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
22ba0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
22bb0 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
22bc0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
22bd0 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
22be0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22bf0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22c00 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
22c10 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
22c20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
22c30 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
22c40 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
22c50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22c60 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
22c70 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
22c80 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
22c90 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
22ca0 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
22cb0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
22cc0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
22cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22ce0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
22cf0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
22d00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
22d10 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29  se, pE->x.pList)
22d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22d30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
22d40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
22d50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
22d60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
22d90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
22da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22db0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
22dc0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
22dd0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
22de0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
22df0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
22e00 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
22e10 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
22e20 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
22e30 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
22e40 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
22e50 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
22e60 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
22e70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
22e80 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
22e90 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
22ea0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
22eb0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
22ec0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
22ed0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
22ee0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
22ef0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
22f00 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
22f10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22f20 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
22f30 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
22f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22f50 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
22f60 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
22f70 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
22f80 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
22fb0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
22fc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
22fd0 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
22fe0 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
22ff0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
23000 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
23010 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
23020 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
23030 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
23040 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
23050 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
23060 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
23070 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23080 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
23090 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
230a0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
230b0 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
230c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
230d0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
230e0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
230f0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
23100 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
23110 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
23120 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
23130 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
23140 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
23150 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
23160 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
23170 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
23180 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
23190 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
231a0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
231b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
231c0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
231d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
231e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
231f0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
23200 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
23210 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
23220 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
23230 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
23240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23250 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
23260 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
23270 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45  gAgg, SQLITE_ECE
23280 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
23290 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
232a0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
232b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
232c0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
232d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
232e0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
232f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
23310 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
23320 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
23330 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
23340 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
23350 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
23360 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
23370 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
23380 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
23390 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
233a0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
233b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
233c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
233d0 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
233e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
233f0 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
23400 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
23410 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
23420 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
23430 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
23440 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
23450 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
23460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
23470 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
23480 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
23490 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
234a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
234b0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
234c0 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
234d0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
234e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
234f0 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
23500 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
23510 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
23520 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
23530 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
23540 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
23550 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
23560 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
23570 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
23580 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
23590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
235a0 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
235b0 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
235c0 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
235d0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
235e0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
235f0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
23600 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
23610 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
23620 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23630 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
23640 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
23650 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
23660 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23670 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
23680 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
23690 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
236a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
236b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
236c0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
236d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
236e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
236f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23700 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
23710 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
23720 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
23730 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
23740 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
23750 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
23760 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
23770 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
23780 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
23790 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
237a0 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
237b0 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
237c0 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
237d0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
237e0 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
237f0 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
23800 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
23810 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
23820 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
23830 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
23840 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
23850 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
23860 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
23870 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
23880 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
23890 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
238a0 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
238b0 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
238c0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
238d0 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
238e0 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
238f0 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
23900 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
23910 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
23920 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
23930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
23940 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
23950 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
23960 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
23970 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
23980 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
23990 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
239a0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
239b0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
239c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
239d0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
239e0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
239f0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
23a00 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
23a10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23a20 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
23a30 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
23a40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
23a50 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
23a60 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
23a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
23a80 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
23a90 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
23aa0 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
23ab0 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
23ac0 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
23ad0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
23ae0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
23af0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23b00 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
23b10 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
23b20 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
23b30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
23b60 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
23b70 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
23b80 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
23b90 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
23ba0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bc0 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
23bd0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
23be0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
23bf0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23c00 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
23c10 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
23c20 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
23c30 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
23c40 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
23c50 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
23c60 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  , .        pIdx 
23c70 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
23c80 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
23c90 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20  .        pIdx ? 
23ca0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
23cb0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
23cc0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
23cd0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
23ce0 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
23cf0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
23d00 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
23d10 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
23d20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
23d30 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
23d40 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
23d50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23d60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
23d70 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
23d80 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
23d90 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
23da0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
23db0 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
23dc0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
23dd0 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
23de0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
23df0 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
23e00 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
23e10 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
23e20 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
23e30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
23e40 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
23e50 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
23e60 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
23e70 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
23e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
23ea0 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
23eb0 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
23ec0 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
23ed0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
23ee0 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
23f00 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
23f10 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
23f20 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
23f30 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
23f40 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
23f50 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
23f60 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
23f90 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
23fa0 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
23fb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23fc0 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
23fd0 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
23fe0 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
23ff0 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
24020 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
24030 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
24040 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
24050 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
24060 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
24070 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
24080 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
240b0 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
240c0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44  table pDest->iSD
240d0 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20  Parm. .**       
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70                Ap
240f0 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ply the affinity
24100 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
24110 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
24120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24130 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
24140 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
24150 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
24160 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
24170 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
24180 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
24190 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
241a0 72 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20  rary table .**  
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
241d0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
241e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
241f0 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
24200 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
24210 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
24220 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
24230 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
24240 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
24250 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
24260 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
24270 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
242a0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
242b0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
242c0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
242d0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
242e0 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
242f0 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
24300 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
24310 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
24320 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
24330 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e  Dest->iSDParm an
24340 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20  d store.**      
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24360 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e  he result there.
24370 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
24380 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a  eft open after.*
24390 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
243a0 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e        returning.
243b0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
243c0 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20  RT_Table except 
243d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
243e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
243f0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65   destination use
24400 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
24410 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  al to create.** 
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69      the table fi
24440 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  rst..**.**     S
24450 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47  RT_Coroutine   G
24460 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
24470 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e  tine that return
24480 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a  s a new row of.*
24490 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
244a0 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61        results ea
244b0 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
244c0 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72  voked.  The entr
244d0 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20  y point.**      
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
244f0 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
24500 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
24510 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53  gister pDest->iS
24520 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
24530 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
24540 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
24550 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
24560 3e 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20  >iSDParm if the 
24570 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
24590 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
245a0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
245b0 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
245c0 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
245d0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
245e0 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
24610 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
24620 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
24630 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
24640 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
24650 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
24660 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
24670 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
24680 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
24690 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
246a0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
246b0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
246c0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
246d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
246e0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
246f0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
24700 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24710 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
24720 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
24730 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
24740 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
24750 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
24760 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
24770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
24780 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
24790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
247a0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
247b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
247c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
247d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
247e0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
247f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
24800 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
24810 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
24820 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
24830 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
24840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24850 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
24860 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
24870 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
24880 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
24890 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
248a0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
248b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
248c0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
248d0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
248e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
248f0 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
24900 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
24910 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
24920 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
24930 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
24940 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
24950 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
24960 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
24970 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
24980 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
24990 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
249a0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
249b0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
249c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
249d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
249e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
249f0 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
24a00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
24a10 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
24a20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
24a30 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
24a40 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
24a50 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
24a60 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
24a70 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
24a80 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
24a90 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
24aa0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
24ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24ac0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
24ad0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
24ae0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
24af0 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
24b00 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
24b10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
24b20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
24b30 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
24b40 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
24b50 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
24b60 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
24b70 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66  word */.  AggInf
24b80 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
24b90 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
24ba0 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
24bb0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
24bc0 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
24bd0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
24be0 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
24bf0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
24c00 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
24c10 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
24c20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
24c30 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
24c40 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
24c50 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
24c60 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
24c70 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
24c80 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
24c90 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
24ca0 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
24cb0 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
24cc0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
24cd0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
24ce0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
24cf0 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
24d00 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
24d10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
24d20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
24d30 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
24d40 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
24d50 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
24d60 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
24d70 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67  nfo));..  if( Ig
24d80 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
24d90 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
24da0 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
24db0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
24dc0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
24dd0 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
24de0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
24df0 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
24e00 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
24e10 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
24e20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
24e30 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
24e40 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
24e50 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
24e60 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
24e70 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
24e80 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
24e90 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
24ea0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
24eb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
24ec0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
24ed0 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
24ee0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
24ef0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
24f00 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
24f10 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f  rse, p, 0);.  pO
24f20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
24f30 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
24f40 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
24f50 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
24f60 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
24f70 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
24f80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24f90 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24fa0 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28  .  }.  isAgg = (
24fb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
24fc0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
24fd0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
24fe0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  !=0 );..  /* Beg
24ff0 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
25000 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
25010 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
25020 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
25030 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
25040 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
25050 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
25060 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
25070 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
25080 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
25090 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
250a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
250b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
250c0 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
250d0 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
250e0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
250f0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
25100 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
25110 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
25120 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
25130 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
25140 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
25150 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
25160 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
25170 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
25180 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
25190 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
251a0 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
251b0 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
251c0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
251d0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
251e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
251f0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
25200 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
25210 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
25220 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
25230 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
25240 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
25250 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62  b;..    if( pSub
25260 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
25270 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
25280 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
25290 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
252a0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
252b0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
252c0 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
252d0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
252e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
252f0 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
25300 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
25310 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
25320 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
25330 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
25340 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
25350 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
25360 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
25370 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
25380 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
25390 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
253a0 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
253b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
253c0 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
253d0 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
253e0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
253f0 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
25400 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
25410 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
25420 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f  if( pItem->viaCo
25430 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
25440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25450 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
25460 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
25470 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
25480 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
25490 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
254a0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
254b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
254c0 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
254d0 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
254e0 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
254f0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
25500 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
25510 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
25520 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
25530 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
25540 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
25550 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
25560 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
25570 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
25580 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
25590 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
255a0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
255b0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
255c0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
255d0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
255e0 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
255f0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
25600 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
25610 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
25620 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
25630 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
25640 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  ;..    isAggSub 
25650 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
25660 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
25670 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
25680 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
25690 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
256a0 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
256b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
256c0 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
256d0 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
256e0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
256f0 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
25700 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
25710 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
25720 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
25730 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
25740 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
25750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
25760 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26  bList->nSrc==1 &
25770 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
25780 20 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29   SF_Materialize)
25790 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74  ==0.      && Opt
257a0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
257b0 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
257c0 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29  Coroutine).    )
257d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65  {.      /* Imple
257e0 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ment a co-routin
257f0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75  e that will retu
25800 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
25810 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
25820 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61      ** set on ea
25830 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  ch invocation.. 
25840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
25850 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  t addrTop;.     
25860 20 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20   int addrEof;.  
25870 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
25880 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
25890 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
258a0 72 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rEof = ++pParse-
258b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20  >nMem;.      /* 
258c0 42 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68  Before coding th
258d0 65 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d  e OP_Goto to jum
258e0 70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  p to the start o
258f0 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  f the main routi
25900 6e 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73  ne,.      ** ens
25910 75 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ure that the jum
25920 70 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d  p to the verify-
25930 73 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68  schema routine h
25940 61 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  as already.     
25950 20 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20   ** been coded. 
25960 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76  Otherwise, the v
25970 65 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75  erify-schema wou
25980 6c 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64  ld likely be cod
25990 65 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ed as .      ** 
259a0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72  part of the co-r
259b0 6f 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d  outine. If the m
259c0 61 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e  ain routine then
259d0 20 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20   accessed the . 
259e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
259f0 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67   before invoking
25a00 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
25a10 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
25a20 6d 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a  me (for .      *
25a30 2a 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69  * example to ini
25a40 74 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20  tialize a LIMIT 
25a50 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20  register from a 
25a60 73 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20  sub-select), it 
25a70 77 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20  would .      ** 
25a80 62 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68  be doing so with
25a90 6f 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66  out having verif
25aa0 69 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76  ied the schema v
25ab0 65 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69  ersion and obtai
25ac0 6e 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ned .      ** th
25ad0 65 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f  e required db lo
25ae0 63 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20  cks. See ticket 
25af0 64 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20  d6b36be38.  */. 
25b00 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
25b10 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
25b20 72 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  rse, -1);.      
25b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25b40 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
25b50 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
25b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
25b70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
25b80 6f 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  o, pItem->iCurso
25b90 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
25ba0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
25bb0 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
25bc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f  omment((v, "coro
25bd0 75 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70  utine for %s", p
25be0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
25bf0 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
25c00 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
25c10 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
25c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25c30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
25c40 30 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20  0, addrEof);.   
25c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
25c60 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
25c70 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
25c80 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
25c90 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
25ca0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
25cb0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
25cc0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
25cd0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
25ce0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
25cf0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
25d00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
25d10 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
25d20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
25d30 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
25d40 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
25d50 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
25d60 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f    pItem->viaCoro
25d70 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
25d80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
25d90 67 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c  geP2(v, addrTop,
25da0 20 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20   dest.iSdst);.  
25db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25dc0 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54  hangeP3(v, addrT
25dd0 6f 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b  op, dest.nSdst);
25de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25df0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
25e00 6e 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45  nteger, 1, addrE
25e10 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  of);.      sqlit
25e20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
25e30 4f 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d  OP_Yield, pItem-
25e40 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
25e50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25e60 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
25e70 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
25e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25e90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
25ea0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
25eb0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
25ec0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
25ed0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
25ee0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
25ef0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
25f00 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
25f10 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
25f20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
25f30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
25f40 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
25f50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
25f60 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
25f70 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
25f80 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
25f90 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
25fa0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
25fb0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
25fc0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
25fd0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
25fe0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
25ff0 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
26000 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
26010 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
26020 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
26030 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
26040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
26050 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
26060 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
26070 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
26080 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26090 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
260a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
260b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
260c0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
260d0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
260e0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
260f0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
26100 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
26110 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
26120 69 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  ize %s", pItem->
26130 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
26140 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
26150 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
26160 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
26170 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
26180 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
26190 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
261a0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
261b0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
261c0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
261d0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
261e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
261f0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
26200 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
26210 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
26220 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
26230 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
26240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
26250 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
26260 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
26270 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
26280 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
26290 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
262a0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
262b0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
262c0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
262d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
262e0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
262f0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
26300 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
26310 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
26320 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
26330 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
26340 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
26350 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
26360 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
26370 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
26380 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
26390 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
263a0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
263b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
263c0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
263d0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
263e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
263f0 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
26400 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
26410 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
26420 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
26430 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
26440 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
26450 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
26460 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
26470 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
26480 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
26490 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
264a0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
264b0 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
264c0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
264d0 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
264e0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
264f0 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
26500 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
26510 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
26520 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
26530 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
26540 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
26550 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
26560 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
26570 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
26580 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
26590 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
265a0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
265b0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
265c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
265d0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
265e0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
265f0 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
26600 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
26610 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
26620 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
26630 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
26640 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
26650 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
26660 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
26670 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
26680 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
26690 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
266a0 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
266b0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
266c0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
266d0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
266e0 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
266f0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
26700 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
26710 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
26720 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
26730 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
26740 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
26750 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
26760 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
26770 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
26780 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
26790 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
267a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
267b0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
267c0 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
267d0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
267e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
267f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
26800 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c    }.    rc = mul
26810 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
26820 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
26830 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
26840 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
26850 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
26860 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
26870 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
26880 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
26890 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
268a0 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
268b0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
268c0 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65  hey are.  ** ide
268d0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73  ntical, then dis
268e0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
268f0 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74  Y clause since t
26900 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a  he GROUP BY.  **
26910 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
26920 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
26930 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
26940 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a  order.  This is.
26950 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61    ** an optimiza
26960 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
26970 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
26980 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
26990 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ss..  ** Use the
269a0 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
269b0 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
269c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
269d0 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f  PTIMIZER.  ** to
269e0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
269f0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
26a00 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
26a10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
26a20 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
26a30 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  re(p->pGroupBy, 
26a40 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
26a50 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
26a60 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
26a70 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
26a80 70 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20  pByOrder) ){.   
26a90 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
26aa0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
26ab0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
26ac0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
26ad0 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
26ae0 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
26af0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
26b00 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
26b10 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
26b20 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
26b30 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
26b40 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
26b50 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
26b60 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
26b70 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
26b80 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
26b90 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
26ba0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
26bb0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
26bc0 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
26bd0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
26be0 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
26bf0 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
26c00 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
26c10 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
26c20 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
26c30 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
26c40 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
26c50 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
26c60 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
26c70 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
26c80 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
26c90 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
26ca0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
26cb0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
26cc0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
26cd0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
26ce0 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
26cf0 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
26d00 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
26d10 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
26d20 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
26d30 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
26d40 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
26d50 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
26d60 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
26d70 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
26d80 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42  tCompare(pOrderB
26d90 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  y, p->pEList, -1
26da0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
26db0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
26dc0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
26dd0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
26de0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
26df0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
26e00 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
26e10 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
26e20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
26e30 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
26e40 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
26e50 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
26e60 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
26e70 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
26e80 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
26e90 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
26ea0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
26eb0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
26ec0 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
26ed0 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
26ee0 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
26ef0 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
26f00 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
26f10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26f20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
26f30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
26f40 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
26f50 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
26f60 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
26f70 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
26f80 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
26f90 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
26fa0 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
26fb0 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
26fc0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
26fd0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
26fe0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
26ff0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
27000 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
27010 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
27020 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
27030 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
27040 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
27050 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
27060 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
27070 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
27080 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
27090 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
270a0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
270b0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
270c0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
270d0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
270e0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
270f0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
27100 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
27110 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
27120 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
27130 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
27140 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
27150 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
27160 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
27170 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
27180 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
27190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
271a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
271b0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
271c0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
271d0 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
27200 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
27210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
27220 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
27230 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
27240 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
27250 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
27260 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
27270 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
27280 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
27290 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
272a0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
272b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
272c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
272d0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
272e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
272f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
27300 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
27310 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
27320 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27330 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
27340 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  w = LARGEST_INT6
27350 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
27360 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
27370 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
27380 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
27390 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  && addrSortIndex
273a0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
273b0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
273c0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
273d0 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
273e0 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65  rOpen;.    p->se
273f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
27400 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
27410 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
27420 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
27430 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
27440 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
27450 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27460 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
27470 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
27480 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
27490 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
274a0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
274b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
274c0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
274d0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
27500 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
27530 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
27540 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27550 70 2d 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20  p->pEList),.    
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
27580 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
27590 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
275a0 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
275b0 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
275c0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
275d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
275e0 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
275f0 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
27600 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
27610 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
27620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
27630 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
27640 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
27650 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
27660 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
27670 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
27680 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
27690 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
276a0 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
276b0 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
276c0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
276d0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
276e0 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
276f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
27700 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
27710 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f  List, pWhere, pO
27720 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
27730 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29    wctrlFlags, 0)
27760 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
27770 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
27780 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
27790 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
277a0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
277b0 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
277c0 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
277d0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
277e0 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
277f0 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
27800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
27810 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
27820 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
27830 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
27840 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
27850 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
27860 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
27870 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
27880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72     }.    if( pOr
27890 64 65 72 42 79 20 26 26 20 73 71 6c 69 74 65 33  derBy && sqlite3
278a0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
278b0 57 49 6e 66 6f 29 20 29 20 70 4f 72 64 65 72 42  WInfo) ) pOrderB
278c0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  y = 0;..    /* I
278d0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
278e0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
278f0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
27900 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
27910 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
27920 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
27930 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
27940 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
27950 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
27960 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
27970 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
27980 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
27990 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
279a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
279b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
279c0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
279d0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
279e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
279f0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
27a00 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
27a10 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
27a20 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
27a30 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
27a40 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
27a50 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44 69  , pOrderBy, &sDi
27a60 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
27a90 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
27aa0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
27ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27ac0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
27ad0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
27ae0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
27af0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
27b00 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
27b10 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
27b20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27b30 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
27b40 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
27b50 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
27b60 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
27b70 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
27b80 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
27b90 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
27ba0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
27bb0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
27bc0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
27bd0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
27be0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
27bf0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
27c00 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
27c10 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
27c20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
27c30 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
27c40 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
27c50 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
27c60 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
27c70 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
27c80 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
27c90 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
27ca0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
27cb0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
27ce0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
27cf0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
27d00 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
27d10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
27d20 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
27d30 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
27d40 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
27d50 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
27d60 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
27d70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
27d80 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
27d90 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
27da0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
27db0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
27dc0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
27dd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
27de0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
27df0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
27e00 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
27e10 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
27e20 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
27e30 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
27e40 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
27e50 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
27e60 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
27e70 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
27e80 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rter */..    /* 
27e90 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
27ea0 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
27eb0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
27ec0 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
27ed0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
27ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27ef0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
27f00 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
27f30 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
27f40 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27f50 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
27f60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
27f70 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
27f80 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
27f90 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
27fa0 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
27fb0 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
27fc0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
27fd0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
27fe0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
27ff0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
28000 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
28010 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
28020 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
28030 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
28040 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
28050 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
28060 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
28070 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53  tRow>100 ) p->nS
28080 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a  electRow = 100;.
28090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
280b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20   1;.    }.. .   
280c0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
280d0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
280e0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
280f0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
28100 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
28110 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28120 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
28130 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
28140 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
28150 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
28160 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
28170 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
28180 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
28190 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
281a0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
281b0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
281c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
281d0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
281e0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
281f0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
28200 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
28210 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
28220 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
28230 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
28240 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
28250 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
28260 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
28270 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
28280 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
28290 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
282a0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
282b0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
282c0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
282d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
282e0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
282f0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
28300 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
28310 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
28320 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
28330 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
28340 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28350 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
28360 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
28370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
28380 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
28390 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
283a0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
283b0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
283c0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
283d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
283e0 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
283f0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
28400 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28410 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
28420 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
28430 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
28440 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
28450 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
28460 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
28470 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
28480 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
28490 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
284a0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
284b0 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
284c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
284d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
284e0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
284f0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
28500 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
28510 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
28520 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
28530 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
28540 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
28550 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
28560 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
28570 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
28580 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
28590 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
285a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
285b0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
285c0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
285d0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
285e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20  /.      int j1; 
285f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28600 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
28610 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
28620 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
28630 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
28640 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
28650 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
28660 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
28670 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
28680 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
28690 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
286a0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
286b0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
286c0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
286d0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
286e0 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
286f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
28700 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
28710 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
28720 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
28730 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
28740 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
28750 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
28760 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
28770 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
28780 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
28790 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
287a0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
287b0 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
287c0 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
287d0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
287e0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
287f0 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
28800 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
28810 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
28820 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
28830 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
28840 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
28850 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
28860 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
28870 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
28880 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
28890 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
288a0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
288b0 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
288c0 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
288d0 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
288e0 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
288f0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
28900 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
28910 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28920 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
28930 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
28940 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
28950 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
28960 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
28970 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
28980 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
28990 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
289a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
289b0 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
289c0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
289d0 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
289e0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
289f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
28a00 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
28a10 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
28a20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
28a30 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
28a40 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
28a50 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
28a60 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
28a70 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
28a80 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
28a90 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
28aa0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
28ab0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
28ac0 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
28ad0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
28ae0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
28af0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28b00 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
28b10 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
28b20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
28b30 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
28b40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28b50 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
28b60 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
28b70 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
28b80 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
28b90 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
28ba0 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
28bb0 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
28bc0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
28bd0 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
28be0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
28bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28c00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
28c10 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
28c20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28c30 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
28c40 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
28c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28c60 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
28c70 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
28c80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28c90 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
28ca0 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
28cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28cc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28cd0 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c  _Null, 0, iAMem,
28ce0 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d   iAMem+pGroupBy-
28cf0 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20  >nExpr-1);..    
28d00 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
28d10 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
28d20 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
28d30 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
28d40 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
28d50 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
28d60 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
28d70 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
28d80 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
28d90 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
28da0 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
28db0 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
28dc0 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
28dd0 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
28de0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
28df0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
28e00 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
28e10 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
28e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28e30 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
28e40 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
28e50 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
28e60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
28e70 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
28e80 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  st, pWhere, pGro
28e90 75 70 42 79 2c 20 30 2c 20 0a 20 20 20 20 20 20  upBy, 0, .      
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
28ec0 5f 47 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20  _GROUPBY, 0);.  
28ed0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
28ee0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
28ef0 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73  end;.      if( s
28f00 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
28f10 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a  ered(pWInfo) ){.
28f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
28f30 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
28f40 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
28f50 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
28f60 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
28f70 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
28f80 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
28f90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
28fa0 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
28fb0 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
28fc0 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
28fd0 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
28fe0 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
28ff0 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
29000 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
29010 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
29020 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
29030 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
29040 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
29050 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
29060 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
29070 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
29080 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
29090 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
290a0 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
290b0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
290c0 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
290d0 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
290e0 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
290f0 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
29100 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
29110 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29120 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
29130 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
29140 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
29150 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
29160 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
29170 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
29180 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
29190 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73   .            (s
291a0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
291b0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26  && (p->selFlags&
291c0 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29  SF_Distinct)==0)
291d0 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
291e0 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
291f0 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b  " : "GROUP BY");
29200 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
29210 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
29220 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
29230 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
29240 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
29250 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
29260 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
29270 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
29280 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
29290 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
292a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
292b0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
292c0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
292d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
292e0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
292f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
29300 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29310 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
29320 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
29330 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
29340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29350 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
29360 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
29370 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29380 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
29390 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
293a0 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
293b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
293c0 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
293d0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
293e0 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47  ngIdx,regBase+nG
293f0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
29400 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
29410 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
29420 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
29430 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
29440 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
29450 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
29460 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
29470 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
29480 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
29490 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
294a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
294b0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
294c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
294d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
294e0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
294f0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
29500 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
29530 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
29540 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
29550 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
29560 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
29580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29590 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
295a0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
295b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
295c0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
295d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
295e0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
295f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
29600 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
29610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29620 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
29630 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
29640 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
29650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29660 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
29670 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
29680 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
29690 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
296a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
296b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
296c0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
296d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
296e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
296f0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
29700 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
29710 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
29720 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
29730 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
29740 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
29750 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
29760 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
29770 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
29780 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
29790 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
297a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
297b0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
297c0 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
297d0 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
297e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
297f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
29800 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
29810 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
29820 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
29830 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
29840 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
29850 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
29860 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
29870 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
29880 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
29890 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
298a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
298b0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
298c0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
298d0 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
298e0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
298f0 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
29900 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
29910 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
29920 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
29930 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
29940 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
29950 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
29960 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
29970 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
29980 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
29990 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
299a0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
299b0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
299c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
299d0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
299e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
299f0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
29a00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29a10 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29a20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
29a30 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
29a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29a50 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
29a60 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
29a70 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74  tingIdx, sortOut
29a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29a90 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
29aa0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
29ab0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
29ac0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
29ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29ae0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
29af0 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
29b00 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
29b10 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
29b20 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
29b30 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
29b40 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
29b50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29b60 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
29b70 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
29b80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29b90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
29ba0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
29bb0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
29bc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29bd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
29be0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29bf0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
29c00 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
29c10 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
29c40 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
29c50 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
29c60 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
29c70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
29c80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
29c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29ca0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
29cb0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
29cc0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
29cd0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
29ce0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
29cf0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
29d00 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
29d10 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
29d20 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
29d30 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
29d40 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
29d50 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
29d60 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
29d70 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
29d80 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
29d90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
29da0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
29db0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
29dc0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
29dd0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
29de0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
29df0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
29e00 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
29e10 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
29e20 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
29e30 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
29e40 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
29e50 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
29e60 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
29e70 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
29e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
29e90 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
29ea0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
29eb0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
29ec0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
29ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29ee0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
29ef0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
29f00 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
29f10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29f20 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
29f30 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
29f40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29f50 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
29f60 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
29f70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
29f80 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
29f90 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
29fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29fb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
29fc0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
29fd0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
29fe0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
29ff0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2a000 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2a010 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2a020 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2a030 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2a040 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2a050 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2a060 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a070 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2a080 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
2a090 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2a0a0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2a0b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2a0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a0d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2a0e0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2a0f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2a100 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2a110 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2a120 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2a130 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2a140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2a150 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2a160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a180 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
2a190 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2a1a0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
2a1b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a1c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2a1d0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2a1e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a1f0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2a200 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
2a210 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2a220 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
2a230 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
2a240 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
2a250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2a270 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
2a280 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2a290 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2a2a0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
2a2b0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
2a2c0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
2a2d0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
2a2e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a300 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
2a310 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
2a320 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2a330 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2a340 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
2a350 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2a360 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
2a370 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
2a380 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
2a390 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
2a3a0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
2a3b0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
2a3c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
2a3d0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
2a3e0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
2a3f0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
2a400 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
2a410 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
2a420 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
2a430 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2a440 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
2a450 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
2a460 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
2a470 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
2a480 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
2a490 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
2a4a0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
2a4b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2a4c0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
2a4d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2a4e0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2a4f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a500 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
2a510 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2a520 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2a530 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
2a540 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2a550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2a560 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
2a570 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
2a580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a590 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2a5a0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
2a5b0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2a5c0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
2a5d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2a5e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a5f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
2a600 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
2a610 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
2a620 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2a630 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
2a640 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
2a650 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
2a660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a670 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2a680 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2a690 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
2a6a0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2a6b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2a6c0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2a6d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2a6e0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
2a6f0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
2a700 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2a710 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
2a720 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2a730 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
2a740 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a760 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
2a770 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
2a790 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
2a7a0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
2a7b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a7c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2a7d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2a7e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2a7f0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
2a800 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
2a810 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
2a820 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2a830 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2a840 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
2a850 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
2a860 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
2a870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a880 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2a890 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2a8a0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2a8b0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2a8c0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
2a8d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2a8e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
2a8f0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
2a900 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
2a910 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
2a920 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
2a930 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
2a940 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
2a950 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
2a960 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
2a970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2a980 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
2a990 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
2a9a0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
2a9b0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
2a9c0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
2a9d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
2a9e0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
2a9f0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
2aa00 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
2aa10 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
2aa20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
2aa30 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
2aa40 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
2aa50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
2aa60 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2aa70 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
2aa80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2aa90 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
2aaa0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
2aab0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
2aac0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
2aad0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2aae0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
2aaf0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
2ab00 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
2ab10 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
2ab20 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
2ab30 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
2ab40 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
2ab50 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
2ab60 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
2ab70 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
2ab80 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
2ab90 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
2aba0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
2abb0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
2abc0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
2abd0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
2abe0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
2abf0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
2ac00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
2ac10 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
2ac20 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
2ac30 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
2ac40 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
2ac50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ac60 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
2ac70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2ac80 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
2ac90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2aca0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2acb0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
2acc0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
2acd0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
2ace0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
2acf0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad10 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2ad20 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2ad30 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2ad40 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
2ad60 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
2ad70 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
2ad80 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
2ad90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ada0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
2adb0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
2adc0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
2add0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
2ade0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
2adf0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2ae00 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
2ae10 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
2ae20 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2ae30 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
2ae40 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2ae50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2ae60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2ae70 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2ae80 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
2ae90 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
2aea0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
2aeb0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
2aec0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
2aed0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2aee0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
2aef0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
2af00 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
2af10 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2af20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2af30 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
2af40 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
2af50 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
2af60 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2af70 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2af80 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
2af90 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
2afa0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
2afb0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
2afc0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
2afd0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
2afe0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
2aff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2b000 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2b010 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
2b020 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2b030 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2b040 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
2b050 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2b060 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2b070 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b080 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
2b090 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2b0a0 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
2b0b0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
2b0c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2b0d0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
2b0e0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
2b0f0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
2b100 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
2b110 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
2b120 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b130 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
2b140 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
2b150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b160 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
2b170 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
2b180 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
2b190 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
2b1a0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
2b1b0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
2b1c0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2b1d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2b1e0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
2b1f0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
2b200 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
2b210 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
2b220 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2b230 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2b240 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
2b250 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
2b260 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
2b270 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
2b280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b290 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2b2a0 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
2b2b0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2b2c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b2d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b2e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
2b2f0 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
2b300 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
2b310 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b320 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2b330 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
2b340 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2b350 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
2b360 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
2b370 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2b380 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b390 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
2b3a0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
2b3b0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2b3c0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
2b3d0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2b3e0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
2b3f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2b400 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
2b410 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
2b420 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
2b430 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
2b440 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b450 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2b460 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
2b470 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
2b480 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
2b490 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
2b4a0 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
2b4b0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
2b4c0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
2b4d0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
2b4e0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
2b4f0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
2b500 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
2b510 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
2b520 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
2b530 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
2b540 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
2b550 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
2b560 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
2b570 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
2b580 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
2b590 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
2b5a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
2b5b0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
2b5c0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
2b5d0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2b5e0 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
2b5f0 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
2b600 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
2b610 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
2b620 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
2b630 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2b640 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
2b650 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
2b660 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
2b670 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
2b680 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
2b690 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
2b6a0 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
2b6b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2b6c0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
2b6d0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
2b6e0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
2b6f0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
2b700 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
2b710 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
2b720 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
2b730 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
2b740 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
2b750 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
2b760 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
2b770 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
2b780 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
2b790 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
2b7a0 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
2b7b0 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
2b7c0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
2b7d0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
2b7e0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
2b7f0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
2b800 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
2b810 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
2b820 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
2b830 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
2b840 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
2b850 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
2b860 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
2b870 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
2b880 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
2b890 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
2b8a0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2b8b0 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
2b8c0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
2b8d0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
2b8e0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
2b8f0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
2b900 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
2b910 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2b920 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
2b930 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
2b940 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
2b950 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
2b960 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
2b970 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
2b980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b990 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2b9a0 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
2b9b0 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
2b9c0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
2b9d0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
2b9e0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
2b9f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2ba00 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
2ba10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ba20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
2ba30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2ba40 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
2ba50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2ba60 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2ba70 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
2ba80 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
2ba90 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
2baa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
2bab0 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
2bac0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
2bad0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
2bae0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
2baf0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2bb00 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
2bb10 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
2bb20 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
2bb30 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
2bb40 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
2bb50 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
2bb60 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
2bb70 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
2bb80 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
2bb90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2bba0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
2bbb0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2bbc0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2bbd0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2bbe0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2bbf0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2bc00 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c  here, pMinMax,0,
2bc10 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
2bc20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2bc30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2bc40 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2bc50 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
2bc60 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
2bc70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
2bc80 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
2bc90 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2bca0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2bcb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bcc0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
2bcd0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
2bce0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2bcf0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2bd00 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a  ered(pWInfo) ){.
2bd10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bd20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2bd30 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
2bd40 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2bd50 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
2bd60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bd70 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
2bd80 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
2bd90 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
2bda0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
2bdb0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
2bdc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bdd0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2bde0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2bdf0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
2be00 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
2be10 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2be20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65    }..      pOrde
2be30 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
2be40 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2be50 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
2be60 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
2be70 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2be80 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
2be90 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2bea0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
2beb0 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2bed0 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
2bee0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
2bef0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2bf00 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
2bf10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2bf20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2bf30 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
2bf40 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
2bf50 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2bf60 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
2bf70 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
2bf80 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2bf90 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
2bfa0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2bfb0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2bfc0 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
2bfd0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2bfe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2bff0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
2c000 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
2c010 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
2c020 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
2c030 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
2c040 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
2c050 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
2c060 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2c070 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b  se, "ORDER BY");
2c080 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
2c090 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
2c0a0 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
2c0b0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
2c0c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2c0d0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
2c0e0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
2c0f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c100 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
2c110 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
2c120 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
2c130 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
2c140 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
2c150 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2c160 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
2c170 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
2c180 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
2c190 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
2c1a0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
2c1b0 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
2c1c0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
2c1d0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
2c1e0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
2c1f0 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
2c200 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2c210 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2c220 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2c230 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
2c240 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
2c250 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
2c260 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
2c270 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
2c280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c290 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
2c2a0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
2c2b0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
2c2c0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2c2d0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
2c2e0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2c2f0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
2c300 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
2c310 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2c320 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
2c330 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c340 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2c350 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2c360 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
2c370 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
2c380 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
2c390 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
2c3a0 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
2c3b0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2c3c0 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62  ainOneSelect(Vdb
2c3d0 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
2c3e0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45   *p){.  sqlite3E
2c3f0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2c400 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a  be, "SELECT ");.
2c410 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2c420 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2c430 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
2c440 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
2c450 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2c460 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nct ){.      sql
2c470 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2c480 66 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e  f(pVdbe, "DISTIN
2c490 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  CT ");.    }.   
2c4a0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2c4b0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2c4c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c4d0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2c4e0 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22  dbe, "agg_flag "
2c4f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2c500 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2c510 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2c520 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2c530 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20  Vdbe, "   ");.  
2c540 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2c550 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2c560 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
2c570 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2c580 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70  (pVdbe);.  if( p
2c590 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
2c5a0 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
2c5b0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
2c5c0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2c5d0 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a  Vdbe, "FROM ");.
2c5e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2c5f0 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20  inPush(pVdbe);. 
2c600 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2c610 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
2c620 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2c630 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2c640 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
2c650 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
2c660 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2c670 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20  (pVdbe, "{%d,*} 
2c680 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  = ", pItem->iCur
2c690 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
2c6a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
2c6b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c6c0 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
2c6d0 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  Vdbe, pItem->pSe
2c6e0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
2c6f0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
2c700 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2c710 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2c720 28 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61  (pVdbe, " (tabna
2c730 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  me=%s)", pItem->
2c740 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2c750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2c760 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
2c770 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2c780 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2c790 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22  intf(pVdbe, "%s"
2c7a0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
2c7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c7c0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
2c7d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c7e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2c7f0 28 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73  (pVdbe, " (AS %s
2c800 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  )", pItem->zAlia
2c810 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
2c820 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
2c830 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
2c840 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2c850 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2c860 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f  pVdbe, " LEFT-JO
2c870 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IN");.      }.  
2c880 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2c890 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2c8a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2c8b0 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b  plainPop(pVdbe);
2c8c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
2c8d0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
2c8e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2c8f0 28 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22  (pVdbe, "WHERE "
2c900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2c910 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2c920 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
2c930 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2c940 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2c950 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
2c960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2c970 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2c980 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a  e, "GROUPBY ");.
2c990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2c9a0 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2c9b0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  , p->pGroupBy);.
2c9c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2c9d0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2c9e0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
2c9f0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
2ca00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2ca10 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b  dbe, "HAVING ");
2ca20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ca30 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
2ca40 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
2ca50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2ca60 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2ca70 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
2ca80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2ca90 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2caa0 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20  , "ORDERBY ");. 
2cab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2cac0 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2cad0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2cae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2caf0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2cb00 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
2cb10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2cb20 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2cb30 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20  e, "LIMIT ");.  
2cb40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2cb50 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2cb60 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
2cb70 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2cb80 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2cb90 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
2cba0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2cbb0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46  rintf(pVdbe, "OF
2cbc0 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  FSET ");.    sql
2cbd0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2cbe0 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65  pVdbe, p->pOffse
2cbf0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2cc00 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2cc10 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
2cc20 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
2cc30 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
2cc40 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
2cc50 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
2cc60 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2cc70 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73  (pVdbe, "(null-s
2cc80 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65  elect)");.    re
2cc90 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  turn;.  }.  whil
2cca0 65 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  e( p->pPrior ){.
2ccb0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70      p->pPrior->p
2ccc0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 70 20  Next = p;.    p 
2ccd0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d  = p->pPrior;.  }
2cce0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2ccf0 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20  nPush(pVdbe);.  
2cd00 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
2cd10 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74  explainOneSelect
2cd20 28 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20  (pVdbe, p);.    
2cd30 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
2cd40 20 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65    if( p==0 ) bre
2cd50 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ak;.    sqlite3E
2cd60 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2cd70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2cd80 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2cd90 20 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f   "%s\n", selectO
2cda0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
2cdb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c   }.  sqlite3Expl
2cdc0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2cdd0 20 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74   "END");.  sqlit
2cde0 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64  e3ExplainPop(pVd
2cdf0 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f  be);.}../* End o
2ce00 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
2ce10 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
2ce20 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
2ce30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ce40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ce50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ce60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ce70 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
2ce80 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2ce90 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
2cea0 20 2a 2f 0a                                       */.