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

Artifact 2d2da29fd4c877646109f7d2fba26b5cc454cd37:


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 70       }else if( p
a3f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
a400: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
a410: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
a420: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
a430: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
a440: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
a450: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
a460: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
a470: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
a480: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a490: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
a4a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a4b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
a4c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a4e0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
a4f0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
a500: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
a510: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a520: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a530: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a540: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a550: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
a560: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
a570: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
a580: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
a590: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
a5c0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
a5d0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
a5e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
a5f0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
a600: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
a610: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
a620: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
a630: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
a640: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
a650: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
a660: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
a670: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
a680: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
a690: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
a6a0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
a6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a6c0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a6d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a6e0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
a6f0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
a700: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
a710: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a720: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a730: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
a740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a750: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
a760: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
a770: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a780: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
a790: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
a7a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
a7b0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
a7c0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
a7d0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
a7e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a7f0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
a800: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a810: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
a820: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a830: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
a840: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
a850: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
a860: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
a870: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
a880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
a890: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
a8b0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
a8c0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a8d0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
a8e0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
a8f0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a900: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
a910: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
a920: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
a930: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
a940: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
a950: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
a960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a970: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
a980: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a990: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
a9a0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
a9b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a9c0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
a9d0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
a9e0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
a9f0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
aa00: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
aa10: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
aa20: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
aa30: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
aa40: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
aa50: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
aa60: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
aa70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
aa80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
aa90: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
aaa0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
aab0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
aac0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
aad0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
aae0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
aaf0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
ab00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ab10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ab20: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ab30: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
ab40: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ab50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
ab60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ab70: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
ab80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
ab90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aba0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
abb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
abc0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
abd0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
abe0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
abf0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
ac00: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
ac10: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
ac20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
ac30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
ac40: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
ac50: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
ac60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
ac70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ac80: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
ac90: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
aca0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
acb0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
acc0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
acd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ace0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
acf0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
ad00: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
ad10: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
ad20: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
ad30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
ad40: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
ad50: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
ad60: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
ad70: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
ad80: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
ad90: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
ada0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
adb0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
adc0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
add0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
ade0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
adf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ae00: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ae10: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
ae20: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
ae30: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ae40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ae50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ae60: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
ae70: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ae80: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
ae90: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
aea0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
aeb0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
aec0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
aed0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
aee0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
aef0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
af00: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
af10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
af20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
af30: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
af40: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
af50: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
af60: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
af70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
af80: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
af90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
afa0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
afb0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
afc0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
afd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
afe0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
aff0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
b000: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
b010: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
b020: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
b030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
b040: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
b050: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b060: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
b070: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
b080: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b090: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
b0a0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
b0b0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
b0c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
b0d0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
b0e0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
b0f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b100: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
b110: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b120: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b130: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
b140: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
b150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b160: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
b170: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
b180: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
b190: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
b1a0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
b1b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
b1c0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
b1d0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
b1e0: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
b1f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b200: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
b210: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
b220: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
b230: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
b240: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
b250: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
b260: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
b270: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b280: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
b290: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
b2a0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
b2b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b2c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
b2d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
b2e0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
b2f0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
b300: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
b310: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
b320: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
b330: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b340: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
b350: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
b360: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
b370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b380: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b390: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
b3a0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
b3b0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
b3c0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
b3d0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
b3e0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
b3f0: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
b400: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
b410: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
b420: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
b430: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
b440: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
b450: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
b460: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
b470: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
b480: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
b490: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
b4a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
b4b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
b4c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b4d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
b4e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
b4f0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
b500: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
b510: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
b520: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
b530: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
b540: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
b550: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
b560: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
b570: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
b580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b590: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
b5a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
b5b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
b5c0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
b5d0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
b5e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
b5f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
b600: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
b610: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
b620: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
b630: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
b640: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
b650: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b660: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
b670: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b680: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b690: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
b6a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
b6b0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
b6c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
b6d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
b6e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b6f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b700: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
b710: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b740: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b750: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
b760: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
b770: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
b780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
b790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
b7a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
b7b0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
b7c0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
b7d0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
b7e0: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
b7f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
b800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b810: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b820: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
b830: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
b840: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
b850: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b860: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
b870: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
b880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b890: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
b8a0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
b8b0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
b8c0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
b8d0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
b8e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
b8f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
b900: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
b910: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
b920: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
b930: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
b940: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b950: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
b960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
b970: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
b980: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
b990: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
b9a0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
b9b0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
b9c0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
b9d0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
b9e0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
b9f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ba00: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ba10: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ba20: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ba30: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ba40: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ba50: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ba60: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ba70: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
ba80: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
ba90: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
baa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bab0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
bac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bad0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
bae0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
baf0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
bb00: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
bb10: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
bb20: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
bb30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
bb40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
bb50: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
bb60: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
bb80: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
bb90: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
bba0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bbb0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
bbc0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bbd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
bbe0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
bbf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bc00: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
bc10: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
bc20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bc30: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
bc40: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
bc50: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
bc60: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
bc70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
bc80: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
bc90: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
bca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bcc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
bcd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bce0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bd00: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
bd10: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
bd20: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
bd30: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
bd40: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
bd50: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
bd60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
bd70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bd80: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
bd90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
bda0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
bdb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
bdc0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
bdd0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
bde0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
bdf0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
be00: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
be10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
be20: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
be30: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
be40: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
be50: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
be60: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
be70: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
be80: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
be90: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
bea0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
beb0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
bec0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
bed0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
bee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
bef0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
bf00: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
bf10: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
bf20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
bf30: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
bf40: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
bf50: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
bf60: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
bf70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bf80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bf90: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
bfa0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
bfb0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
bfc0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
bfd0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
bfe0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
bff0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
c000: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
c010: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
c020: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
c030: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
c040: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
c050: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
c060: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
c070: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
c080: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
c090: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
c0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c0b0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c0c0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
c0d0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
c0e0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
c0f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
c100: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
c110: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
c120: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
c130: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
c140: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
c150: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
c160: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
c170: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c180: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c190: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
c1a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c1b0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
c1c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
c1d0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
c1e0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
c1f0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
c200: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c210: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
c220: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
c230: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
c240: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
c250: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
c260: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
c270: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
c280: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
c290: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
c2a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
c2b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
c2c0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
c2d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
c2e0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
c2f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c300: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
c310: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
c320: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
c330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
c340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c350: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c360: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
c370: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
c390: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
c3a0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
c3b0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
c3c0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
c3d0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
c3e0: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
c3f0: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
c400: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
c410: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
c420: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c430: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
c440: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
c450: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
c470: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
c480: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
c490: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
c4a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
c4b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
c4c0: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
c4d0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
c4e0: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
c4f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
c500: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
c510: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
c520: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
c530: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
c540: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c550: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
c560: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
c570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c580: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c590: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c5a0: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
c5b0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
c5c0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
c5d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
c5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
c5f0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
c600: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
c610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c620: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
c630: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
c640: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
c650: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
c670: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
c680: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
c690: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
c6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
c6e0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
c6f0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
c700: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
c710: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
c720: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
c730: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
c740: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
c750: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
c760: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
c770: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
c780: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
c790: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
c7a0: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
c7b0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
c7c0: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
c7d0: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
c7e0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
c7f0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
c800: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
c810: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
c820: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
c830: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
c840: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
c850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c860: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
c870: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
c880: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c890: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c8a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
c8b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
c8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
c8d0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
c8e0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
c8f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
c900: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c910: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
c920: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
c930: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
c940: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
c950: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c960: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
c970: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
c980: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
c990: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
c9a0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
c9b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9c0: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
c9d0: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
c9e0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
c9f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
ca00: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
ca10: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
ca20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
ca30: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
ca40: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
ca50: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
ca60: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
ca70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ca80: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
ca90: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
caa0: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
cab0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
cac0: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
cad0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
cae0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
caf0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cb00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
cb10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
cb20: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
cb30: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
cb40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
cb50: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
cb60: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
cb70: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
cb80: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
cb90: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
cba0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
cbb0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
cbc0: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
cbd0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
cbe0: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
cbf0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
cc00: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
cc10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
cc20: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
cc30: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
cc40: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
cc50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
cc60: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
cc70: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
cc80: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
cc90: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
cca0: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
ccb0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
ccc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
ccd0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
cce0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ccf0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
cd00: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
cd10: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
cd20: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
cd30: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
cd40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
cd50: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
cd60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
cd70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cd80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
cd90: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
cda0: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
cdb0: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
cdc0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
cdd0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
cde0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cdf0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ce00: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ce10: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ce20: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ce30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ce40: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ce50: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ce60: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ce70: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ce80: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ce90: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
cea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ceb0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
cec0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ced0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
cee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cef0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
cf00: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cf10: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
cf20: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
cf30: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
cf40: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
cf50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
cf60: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
cf70: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
cf80: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
cf90: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
cfa0: 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
cfb0: 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c  576;.  selectCol
cfc0: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
cfd0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
cfe0: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
cff0: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
d000: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
d010: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
d020: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
d030: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
d040: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
d050: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
d060: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d070: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
d080: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
d090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d0a0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
d0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
d0c0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
d0d0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
d0e0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
d0f0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
d100: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
d110: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
d120: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
d130: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d140: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
d150: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
d160: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
d170: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d180: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
d190: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
d1a0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
d1b0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
d1c0: 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
d1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d1e0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
d1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d200: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
d210: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
d220: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
d230: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
d240: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
d250: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
d260: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
d270: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d280: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d290: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
d2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d2b0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
d2c0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d2d0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
d2e0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
d2f0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
d300: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
d310: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
d320: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
d330: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
d340: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
d350: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
d360: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
d370: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
d380: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
d390: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
d3a0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
d3b0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
d3c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
d3d0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
d3e0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
d3f0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
d400: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
d410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d420: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
d430: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
d440: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
d450: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
d460: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d470: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
d480: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
d490: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
d4a0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
d4b0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
d4c0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
d4d0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
d4e0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
d4f0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
d500: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
d510: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
d520: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
d530: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
d540: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
d550: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
d560: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
d570: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
d580: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
d590: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
d5a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
d5b0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
d5c0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
d5d0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
d5e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
d5f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
d600: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d610: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d620: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
d630: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
d640: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
d650: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
d660: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
d670: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
d680: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
d690: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
d6a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
d6b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
d6c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
d6d0: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
d6e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
d6f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
d700: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
d710: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
d720: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
d730: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
d740: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
d750: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
d760: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
d770: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
d780: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
d790: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
d7a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
d7b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
d7c0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
d7d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d7e0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
d7f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d800: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d810: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
d820: 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20   /* VDBE should 
d830: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d840: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
d850: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d860: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
d870: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
d880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d8a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
d8b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d8c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
d8d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
d8e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d900: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d910: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
d920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
d930: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
d940: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
d950: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
d960: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
d970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d990: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
d9a0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
d9d0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
d9e0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d9f0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
da00: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
da10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da20: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
da30: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
da40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
da50: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
da60: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
da70: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
da80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
da90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
daa0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
dab0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
dac0: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
dad0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
dae0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
daf0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
db00: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
db10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
db20: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
db30: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
db40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
db50: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
db60: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
db70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
db80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
db90: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
dba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dbb0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
dbc0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
dbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dbe0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dbf0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dc10: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
dc20: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
dc30: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
dc40: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
dc50: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
dc60: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
dc70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc80: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
dc90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dcb0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
dcc0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
dcd0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dce0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
dcf0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
dd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
dd10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
dd20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dd30: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
dd40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
dd50: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
dd60: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
dd70: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
dd80: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
dd90: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
dda0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
ddb0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
ddc0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
ddd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dde0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
ddf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
de00: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
de10: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
de20: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
de30: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
de40: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
de50: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
de60: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
de70: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
de80: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
de90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
dea0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
deb0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
dec0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
ded0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
dee0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
def0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
df00: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
df10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
df20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
df30: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
df40: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
df50: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
df60: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
df70: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
df80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
df90: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
dfa0: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
dfb0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
dfc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
dfd0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
dfe0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
dff0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
e000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
e010: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
e020: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e030: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e040: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e050: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
e070: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
e080: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
e090: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e0a0: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
e0b0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
e0c0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
e0d0: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
e0e0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e0f0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
e100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e110: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
e120: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
e130: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
e140: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
e150: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
e160: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
e170: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
e180: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
e190: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
e1a0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
e1b0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
e1c0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
e1d0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
e1e0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
e1f0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
e200: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
e210: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
e220: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
e230: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
e240: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
e250: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
e260: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
e270: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
e280: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e290: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
e2a0: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
e2b0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
e2c0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
e2d0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
e2e0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
e2f0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
e300: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
e310: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
e320: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
e330: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
e340: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
e350: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
e360: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
e370: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e380: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
e390: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
e3a0: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
e3b0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
e3c0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
e3d0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
e3e0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
e3f0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
e400: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
e410: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
e420: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
e430: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
e440: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
e450: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
e460: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
e470: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
e480: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
e490: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
e4a0: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
e4b0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
e4c0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
e4d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
e4e0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
e4f0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
e500: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
e510: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
e520: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
e530: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
e540: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
e550: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
e560: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
e570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e580: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e590: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e5a0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
e5c0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
e5d0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
e5e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
e5f0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
e600: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
e610: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
e620: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e630: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
e640: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
e650: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
e660: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
e670: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
e680: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
e690: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
e6a0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e6d0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
e6e0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
e6f0: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
e700: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
e710: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
e720: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
e730: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
e740: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
e750: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
e760: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
e770: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e780: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
e790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
e7a0: 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
e7b0: 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
e7c0: 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
e7d0: 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
e7e0: 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
e7f0: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
e800: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
e810: 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
e820: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e830: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
e840: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
e850: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
e860: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
e870: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
e880: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
e890: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
e8a0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
e8b0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
e8d0: 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
e8e0: 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
e8f0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
e900: 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
e910: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
e920: 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
e930: 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
e940: 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
e950: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
e960: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
e970: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
e980: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
e990: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
e9a0: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
e9b0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
e9c0: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
e9d0: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
e9e0: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
e9f0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
ea00: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ea10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ea20: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
ea30: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
ea40: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
ea50: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
ea60: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
ea70: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
ea80: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
ea90: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
eaa0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
eab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
eac0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
ead0: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
eae0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
eaf0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
eb00: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
eb10: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
eb20: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
eb30: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
eb40: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
eb50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
eb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
eb70: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
eb80: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
eb90: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
eba0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
ebb0: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
ebc0: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
ebd0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
ebe0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
ebf0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
ec00: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
ec10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
ec20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ec30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ec40: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
ec50: 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
ec60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
ec70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ec80: 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
ec90: 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
eca0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
ecb0: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
ecc0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
ecd0: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
ece0: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
ecf0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
ed00: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
ed10: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
ed20: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
ed30: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
ed40: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
ed50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
ed60: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
ed70: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
ed80: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
ed90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
eda0: 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ues ){.      sql
edb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
edc0: 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
edd0: 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
ede0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
edf0: 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rms");.    }else
ee00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ee10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ee20: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
ee30: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
ee40: 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20  f %s".        " 
ee50: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
ee60: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
ee70: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
ee80: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ee90: 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op));.    }.    
eea0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
eeb0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
eec0: 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  d;.  }..#ifndef 
eed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
eee0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
eef0: 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  a recursive quer
ef00: 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
ef10: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
ef20: 42 59 20 6f 72 0a 20 20 2a 2a 20 4c 49 4d 49 54  BY or.  ** LIMIT
ef30: 20 63 6c 61 75 73 65 2e 20 4e 65 69 74 68 65 72   clause. Neither
ef40: 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 73 75   of these are su
ef50: 70 70 6f 72 74 65 64 2e 20 20 2a 2f 0a 20 20 61  pported.  */.  a
ef60: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
ef70: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
ef80: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  t );.  if( (p->s
ef90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
efa0: 75 72 73 69 76 65 29 20 26 26 20 28 70 2d 3e 70  ursive) && (p->p
efb0: 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4c  OrderBy || p->pL
efc0: 69 6d 69 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  imit) ){.    sql
efd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
efe0: 72 73 65 2c 20 22 25 73 20 69 6e 20 61 20 72 65  rse, "%s in a re
eff0: 63 75 72 73 69 76 65 20 71 75 65 72 79 20 69 73  cursive query is
f000: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 2c 0a 20   not allowed",. 
f010: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
f020: 42 79 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20  By ? "ORDER BY" 
f030: 3a 20 22 4c 49 4d 49 54 22 0a 20 20 20 20 29 3b  : "LIMIT".    );
f040: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
f050: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
f060: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
f070: 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
f080: 65 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  e ){.    SrcList
f090: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
f0a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
f0b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f0c0: 72 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  r;.    int addrN
f0d0: 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  ext;.    int add
f0e0: 72 53 77 61 70 3b 0a 20 20 20 20 69 6e 74 20 69  rSwap;.    int i
f0f0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a 20 20  Cont, iBreak;.  
f100: 20 20 69 6e 74 20 74 6d 70 31 3b 20 20 20 20 20    int tmp1;     
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 2f 2a 20 49 6e 74 65 72 6d 65 64 69 61 74 65 20  /* Intermediate 
f130: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
f140: 20 74 6d 70 32 3b 20 20 20 20 20 20 20 20 20 20   tmp2;          
f150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
f160: 78 74 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  xt intermediate 
f170: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
f180: 20 74 6d 70 33 20 3d 20 30 3b 20 20 20 20 20 20   tmp3 = 0;      
f190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
f1a0: 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
f1b0: 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
f1c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 65 44 65 73 74  */.    int eDest
f1d0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
f1e0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 74 6d 70    SelectDest tmp
f1f0: 32 64 65 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  2dest;.    int i
f200: 3b 0a 0a 20 20 20 20 69 42 72 65 61 6b 20 3d 20  ;..    iBreak = 
f210: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f220: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 43 6f  abel(v);.    iCo
f230: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
f240: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
f250: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
f260: 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
f270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f280: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52  ( pSrc->a[i].isR
f290: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
f2a0: 20 20 20 20 74 6d 70 31 20 3d 20 70 53 72 63 2d      tmp1 = pSrc-
f2b0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
f2c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f2e0: 20 74 6d 70 32 20 3d 20 70 50 61 72 73 65 2d 3e   tmp2 = pParse->
f2f0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
f300: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
f310: 29 7b 0a 20 20 20 20 20 20 65 44 65 73 74 20 3d  ){.      eDest =
f320: 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3b 0a   SRT_DistTable;.
f330: 20 20 20 20 20 20 74 6d 70 33 20 3d 20 70 50 61        tmp3 = pPa
f340: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f350: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
f360: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 74 6d  lectDestInit(&tm
f370: 70 32 64 65 73 74 2c 20 65 44 65 73 74 2c 20 74  p2dest, eDest, t
f380: 6d 70 32 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  mp2);..    sqlit
f390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f3a0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
f3b0: 2c 20 74 6d 70 31 2c 20 6e 43 6f 6c 29 3b 0a 20  , tmp1, nCol);. 
f3c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f3d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f3e0: 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 32 2c 20  phemeral, tmp2, 
f3f0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 74  nCol);.    if( t
f400: 6d 70 33 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  mp3 ){.      p->
f410: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
f420: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f430: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f440: 68 65 6d 65 72 61 6c 2c 20 74 6d 70 33 2c 20 30  hemeral, tmp3, 0
f450: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  );.      p->selF
f460: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
f470: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 7d 0a  phemeral;.    }.
f480: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
f490: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
f4a0: 20 69 6e 69 74 69 61 6c 20 53 45 4c 45 43 54 20   initial SELECT 
f4b0: 69 6e 20 74 6d 70 32 2e 20 2a 2f 0a 20 20 20 20  in tmp2. */.    
f4c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
f4d0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
f4e0: 72 2c 20 26 74 6d 70 32 64 65 73 74 29 3b 0a 20  r, &tmp2dest);. 
f4f0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f500: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f510: 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  d;..    /* Clear
f520: 20 74 6d 70 31 2e 20 54 68 65 6e 20 73 77 69 74   tmp1. Then swit
f530: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ch the contents 
f540: 6f 66 20 74 6d 70 31 20 61 6e 64 20 74 6d 70 32  of tmp1 and tmp2
f550: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  . Then return . 
f560: 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
f570: 74 73 20 6f 66 20 74 6d 70 31 20 74 6f 20 74 68  ts of tmp1 to th
f580: 65 20 63 61 6c 6c 65 72 2e 20 4f 72 2c 20 69 66  e caller. Or, if
f590: 20 74 6d 70 31 20 69 73 20 65 6d 70 74 79 20 61   tmp1 is empty a
f5a0: 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 6f  t this.    ** po
f5b0: 69 6e 74 2c 20 74 68 65 20 72 65 63 75 72 73 69  int, the recursi
f5c0: 76 65 20 71 75 65 72 79 20 68 61 73 20 66 69 6e  ve query has fin
f5d0: 69 73 68 65 64 20 2d 20 6a 75 6d 70 20 74 6f 20  ished - jump to 
f5e0: 61 64 64 72 65 73 73 20 69 42 72 65 61 6b 2e 20  address iBreak. 
f5f0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 53 77 61 70   */.    addrSwap
f600: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f610: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 77 61 70 43  dOp2(v, OP_SwapC
f620: 75 72 73 6f 72 73 2c 20 74 6d 70 31 2c 20 74 6d  ursors, tmp1, tm
f630: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p2);.    sqlite3
f640: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f650: 5f 52 65 77 69 6e 64 2c 20 74 6d 70 31 2c 20 69  _Rewind, tmp1, i
f660: 42 72 65 61 6b 29 3b 0a 20 20 20 20 61 64 64 72  Break);.    addr
f670: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
f680: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f690: 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  ;.    selectInne
f6a0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
f6b0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 6d 70 31   p->pEList, tmp1
f6c0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
f6d0: 70 72 2c 0a 20 20 20 20 20 20 20 20 30 2c 20 30  pr,.        0, 0
f6e0: 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
f6f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  iBreak);.    sql
f700: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f710: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
f720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f730: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f740: 2c 20 74 6d 70 31 2c 20 61 64 64 72 4e 65 78 74  , tmp1, addrNext
f750: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 65 63 75  );..    /* Execu
f760: 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65  te the recursive
f770: 20 53 45 4c 45 43 54 2e 20 53 74 6f 72 65 20 74   SELECT. Store t
f780: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 6d  he results in tm
f790: 70 32 2e 20 57 68 69 6c 65 20 74 68 69 73 0a 20  p2. While this. 
f7a0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 69 73 20     ** SELECT is 
f7b0: 72 75 6e 6e 69 6e 67 2c 20 74 68 65 20 63 6f 6e  running, the con
f7c0: 74 65 6e 74 73 20 6f 66 20 74 6d 70 31 20 61 72  tents of tmp1 ar
f7d0: 65 20 72 65 61 64 20 62 79 20 72 65 63 75 72 73  e read by recurs
f7e0: 69 76 65 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  ive .    ** refe
f7f0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75  rences to the cu
f800: 72 72 65 6e 74 20 43 54 45 2e 20 20 2a 2f 0a 20  rrent CTE.  */. 
f810: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f820: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f830: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f840: 20 70 2c 20 26 74 6d 70 32 64 65 73 74 29 3b 0a   p, &tmp2dest);.
f850: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f860: 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
f870: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
f880: 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  or;.    if( rc )
f890: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f8a0: 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 73 71 6c  ct_end;..    sql
f8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8c0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
f8d0: 64 72 53 77 61 70 29 3b 0a 20 20 20 20 73 71 6c  drSwap);.    sql
f8e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f8f0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
f900: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
f910: 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
f920: 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
f930: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
f940: 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
f950: 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
f960: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
f970: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
f980: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
f990: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
f9a0: 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
f9b0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f9c0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
f9d0: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
f9e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
f9f0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
fa00: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
fa10: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
fa20: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
fa30: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
fa40: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
fa50: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
fa60: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
fa70: 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
fa80: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
fa90: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
faa0: 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
fab0: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
fac0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
fad0: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
fae0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
faf0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
fb00: 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
fb10: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
fb20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
fb30: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
fb40: 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
fb50: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
fb60: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
fb70: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
fb80: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
fb90: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
fba0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
fbb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
fbc0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
fbd0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
fbe0: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
fbf0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
fc00: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
fc10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
fc20: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
fc30: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
fc40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
fc50: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
fc60: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
fc70: 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
fc80: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
fc90: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
fca0: 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
fcb0: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
fcc0: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
fcd0: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
fce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
fcf0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
fd00: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
fd10: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
fd20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
fd30: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
fd40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
fd50: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
fd60: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
fd70: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
fd80: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
fd90: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
fda0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
fdb0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
fdc0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
fdd0: 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
fde0: 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
fdf0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
fe00: 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
fe10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
fe20: 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
fe30: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
fe40: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
fe50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
fe70: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
fe80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fe90: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
fea0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
feb0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
fec0: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
fed0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
fee0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
fef0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
ff00: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
ff10: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
ff20: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
ff30: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
ff40: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
ff50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
ff60: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
ff70: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
ff80: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
ff90: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
ffa0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
ffb0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
ffc0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
ffd0: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
ffe0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
fff0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
10000 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
10010 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
10020 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
10030 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
10040 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
10050 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
10060 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
10070 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
10080 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
10090 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
100a0 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
100b0 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
100c0 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
100d0 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
100e0 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
100f0 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
10100 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
10110 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
10120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10130 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
10140 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
10150 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
10160 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
101a0 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
101b0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
101c0 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
101d0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
101e0 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
101f0 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
10200 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
10210 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
10220 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
10230 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
10240 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
10250 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
10260 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
10270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10280 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
10290 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
102a0 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
102b0 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
102c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
102d0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
102e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
102f0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
10300 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10320 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
10330 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
10340 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10350 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
10360 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
10370 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
10380 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10390 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
103a0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
103b0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
103c0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
103d0 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
103e0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
103f0 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
10400 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10410 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
10420 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10430 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10440 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
10450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10460 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
10470 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
10480 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10490 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
104a0 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
104b0 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
104c0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
104d0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
104e0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
104f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10500 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10510 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
10520 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10530 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
10540 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10550 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
10560 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
10570 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
10580 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
10590 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
105a0 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
105b0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
105c0 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
105d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
105e0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
105f0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
10600 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
10610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
10620 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
10630 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
10640 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
10650 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
10660 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
10670 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
10680 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
10690 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
106a0 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
106b0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
106c0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
106d0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
106e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
106f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10700 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
10710 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10720 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
10730 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
10740 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
10750 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
10760 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
10770 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
10780 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10790 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
107a0 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
107b0 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
107c0 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
107d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
107e0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
107f0 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
10800 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
10810 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
10820 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
10830 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10840 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
10850 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
10860 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
10870 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
10880 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
10890 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
108a0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
108b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
108c0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
108d0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
108e0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
108f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
10900 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
10910 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
10920 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
10930 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10940 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
10950 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
10960 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
10970 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
10980 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
10990 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
109a0 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
109b0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
109c0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
109d0 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
109e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
109f0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10a00 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
10a10 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
10a30 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
10a40 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
10a50 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
10a60 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
10a70 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
10a80 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
10a90 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
10aa0 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
10ab0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
10ac0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
10ad0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
10ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
10af0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10b00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10b10 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
10b20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10b30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
10b40 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10b50 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10b60 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b80 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10b90 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
10ba0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
10bb0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
10bc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
10bd0 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
10be0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
10bf0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
10c00 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
10c10 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
10c40 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
10c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10c70 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
10c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c90 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10ca0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
10cb0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10cc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10cd0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
10ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10cf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d00 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
10d10 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10d20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10d30 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
10d40 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
10d50 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
10d60 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
10d70 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
10d80 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10d90 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
10da0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
10db0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
10dc0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
10dd0 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
10de0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
10df0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
10e00 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
10e10 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
10e20 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
10e30 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
10e40 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10e50 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
10e60 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
10e70 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
10e80 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
10e90 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
10ea0 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
10eb0 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
10ec0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10ed0 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
10ee0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
10ef0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
10f00 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
10f10 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
10f20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
10f30 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
10f40 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
10f50 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
10f60 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
10f70 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
10f80 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
10f90 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
10fa0 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
10fb0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
10fc0 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
10fd0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10fe0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
10ff0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
11000 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
11010 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
11020 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
11030 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
11040 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
11050 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
11060 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
11070 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
11080 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
11090 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
110a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
110b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
110c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
110d0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
110e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
110f0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
11100 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11110 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
11120 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
11130 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
11140 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
11150 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
11160 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11170 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11180 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
11190 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
111a0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
111b0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
111c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
111d0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
111e0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
111f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
11200 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11210 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
11220 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
11230 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
11240 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
11250 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
11260 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
11270 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
11280 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
11290 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
112a0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
112b0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
112c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
112d0 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
112e0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
112f0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
11300 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
11310 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
11320 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
11330 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
11340 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
11350 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
11360 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
11370 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
11380 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
11390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
113a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
113b0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
113c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
113d0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
113e0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
113f0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
11400 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
11410 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
11420 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
11430 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
11440 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
11450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11460 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
11470 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
11480 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
11490 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
114a0 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
114b0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
114c0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
114d0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
114e0 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
114f0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
11500 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
11510 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
11520 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
11530 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11540 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
11550 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
11560 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11570 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
11580 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11590 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
115a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
115b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
115c0 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
115d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20  reak);.      r1 
115e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
115f0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11600 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
11610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11620 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
11630 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
11640 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
11650 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
11660 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
11670 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
11680 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11690 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
116a0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
116b0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
116c0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
116d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
116e0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
116f0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
11700 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
11710 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
11720 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11730 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
11740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
11760 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
11770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11780 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11790 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
117a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
117c0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
117d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117e0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
117f0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
11800 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11810 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
11820 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
11830 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
11840 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
11850 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
11860 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11870 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
11880 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
11890 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
118a0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
118b0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
118c0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
118d0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
118e0 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
118f0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
11900 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
11910 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
11920 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
11930 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
11940 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
11950 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
11960 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
11970 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
11980 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
11990 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
119a0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
119b0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
119c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
119d0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
119e0 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
119f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11a00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
11a10 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
11a20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11a50 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
11a60 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
11a70 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
11a80 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
11a90 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11aa0 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
11ab0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
11ac0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11ad0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
11ae0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
11af0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
11b00 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
11b10 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11b20 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
11b30 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
11b40 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
11b70 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
11b80 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
11b90 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
11ba0 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==p );.    nCol 
11bb0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
11bc0 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
11bd0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
11be0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
11bf0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
11c00 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
11c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11c20 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
11c30 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
11c40 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
11c50 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
11c60 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
11c70 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
11c80 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
11c90 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11ca0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11cb0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
11cc0 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
11cd0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
11ce0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
11cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11d00 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
11d10 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
11d20 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
11d30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
11d40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11d50 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
11d60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
11d70 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
11d80 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11d90 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
11da0 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
11db0 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
11dc0 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
11dd0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
11de0 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
11df0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
11e00 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
11e10 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
11e20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
11e30 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
11e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
11e50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11e70 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
11e80 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
11e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11ea0 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
11eb0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
11ec0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
11ed0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
11f00 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
11f10 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
11f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11f30 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
11f40 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
11f50 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
11f60 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
11f70 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
11f80 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
11f90 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
11fa0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
11fb0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
11fc0 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
11fd0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
11fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
11ff0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
12000 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
12010 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
12020 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
12030 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12040 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
12050 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
12060 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
12070 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
12080 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
12090 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
120a0 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
120b0 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
120c0 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
120d0 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
120e0 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
120f0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
12100 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
12110 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
12120 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
12130 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
12140 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
12150 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
12160 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
12170 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
12180 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
12190 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
121a0 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
121b0 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
121c0 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
121d0 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
121e0 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
121f0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
12200 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
12210 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
12220 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
12230 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
12240 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
12250 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
12260 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
12270 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
12280 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
12290 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
122a0 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
122b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
122c0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
122d0 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
122e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
122f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12300 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12310 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12320 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
12330 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
12340 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
12350 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
12360 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
12370 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
12380 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
12390 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
123a0 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
123b0 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
123c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
123d0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
123e0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
123f0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
12400 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
12410 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
12420 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
12430 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
12440 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
12450 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
12460 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
12470 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
12480 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
12490 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
124a0 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
124b0 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
124c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
124d0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
124e0 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
124f0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
12500 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12510 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
12520 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
12530 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
12540 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
12550 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
12560 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
12570 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
12580 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
12590 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
125a0 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
125b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
125c0 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
125d0 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
125e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
125f0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
12600 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
12610 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12640 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
12650 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
12660 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
12670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12680 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
12690 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
126a0 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c  , j2+2);.    sql
126b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
126c0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
126d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
126e0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
126f0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
12700 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
12710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12730 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
12740 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
12750 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12760 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
12770 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
12780 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
12790 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
127a0 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
127b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
127c0 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
127d0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
127e0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
127f0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
12800 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
12810 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
12820 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
12830 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
12840 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
12850 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
12860 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
12870 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12880 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
12890 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
128a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
128b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
128c0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
128d0 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
128e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
128f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
12900 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
12910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12920 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
12930 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
12940 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
12950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12970 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
12980 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
12990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
129a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
129b0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
129c0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
129d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
129e0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
129f0 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
12a00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12a10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12a20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
12a30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12a40 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
12a50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12a60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12a70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
12a80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
12a90 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
12aa0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
12ab0 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
12ac0 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
12ad0 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
12ae0 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
12af0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
12b00 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
12b10 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
12b20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
12b30 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
12b40 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
12b50 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
12b60 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
12b70 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
12b80 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
12b90 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
12ba0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
12bb0 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
12bc0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12bd0 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
12be0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
12bf0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12c00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
12c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12c20 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
12c30 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
12c40 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
12c50 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
12c60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12c70 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
12c80 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
12c90 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
12ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12cb0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
12cc0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
12cd0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
12ce0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12cf0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
12d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12d10 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
12d20 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
12d30 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
12d40 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
12d50 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
12d60 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
12d70 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
12d80 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
12d90 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
12da0 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
12db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12dc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12dd0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
12de0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
12df0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
12e00 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
12e10 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
12e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12e30 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
12e40 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
12e50 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
12e60 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
12e70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
12e80 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
12e90 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
12ea0 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
12eb0 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
12ec0 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
12ed0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
12ee0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
12ef0 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
12f00 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
12f10 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
12f20 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
12f30 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
12f40 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
12f50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
12f60 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
12f70 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
12f80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
12f90 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
12fa0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12fb0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
12fc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12fd0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
12fe0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
12ff0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
13000 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
13010 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
13020 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
13030 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
13040 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
13050 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
13060 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
13070 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
13080 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
13090 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
130a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
130b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
130c0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
130d0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
130e0 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
130f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13100 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
13110 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
13120 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
13130 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a   pDest->nSdst);.
13140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13150 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13160 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
13170 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
13180 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13190 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
131a0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
131b0 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
131c0 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
131d0 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
131e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
131f0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
13200 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
13210 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
13220 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
13230 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
13240 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
13250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
13260 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
13270 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
13280 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
13290 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
132a0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
132b0 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
132c0 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
132d0 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
132e0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
132f0 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
13300 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
13310 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
13320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13330 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
13340 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
13350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13360 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
13370 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
13380 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
13390 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
133a0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
133b0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
133c0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
133d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
133e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
133f0 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
13400 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
13410 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
13420 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
13430 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
13440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13450 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
13460 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
13470 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
13480 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
13490 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
134a0 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
134b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
134c0 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
134d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
134e0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
134f0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
13500 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
13510 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
13520 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
13530 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
13540 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
13550 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
13560 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
13570 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
13580 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
13590 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
135a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
135b0 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
135c0 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
135d0 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
135e0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
135f0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
13600 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
13610 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
13620 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
13630 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
13640 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
13650 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
13660 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
13670 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
13680 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
13690 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
136a0 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
136b0 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
136c0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
136d0 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
136e0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
136f0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
13700 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
13710 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
13720 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
13730 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
13740 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
13750 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
13760 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
13770 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
13780 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
13790 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
137a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
137b0 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
137c0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
137d0 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
137e0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
137f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
13800 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
13810 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
13820 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
13830 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
13840 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
13850 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
13860 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
13870 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
13890 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
138a0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
138b0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
138c0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
138d0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
138e0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
138f0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
13900 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
13910 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
13920 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
13930 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
13940 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
13950 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
13960 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
13970 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
13980 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
13990 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
139a0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
139b0 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
139c0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
139d0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
139e0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
139f0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
13a00 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
13a10 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
13a20 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
13a30 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
13a40 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
13a50 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
13a60 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
13a70 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
13a80 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
13a90 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
13aa0 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
13ab0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
13ac0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
13b00 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
13b10 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
13b20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
13b30 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
13b40 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
13b50 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
13b60 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
13b70 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
13b80 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
13b90 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
13ba0 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
13bb0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
13bc0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
13bd0 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
13be0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
13bf0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
13c00 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
13c10 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
13c20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
13c30 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
13c40 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
13c50 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
13c60 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
13c70 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
13c80 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
13c90 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
13ca0 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
13cb0 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
13cc0 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
13cd0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
13ce0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
13cf0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
13d00 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
13d10 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
13d20 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
13d30 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
13d40 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
13d50 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
13d60 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
13d70 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
13d80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
13d90 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
13da0 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
13db0 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
13dc0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
13dd0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
13de0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
13df0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
13e00 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
13e10 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
13e20 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
13e30 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
13e40 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
13e50 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
13e60 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
13e70 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
13e80 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
13e90 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
13ea0 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
13eb0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
13ec0 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
13ed0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
13ee0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
13ef0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
13f00 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
13f10 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
13f20 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
13f30 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
13f40 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
13f50 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
13f60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
13f70 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
13f80 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
13f90 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
13fa0 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
13fb0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
13fc0 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
13fd0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
13fe0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
13ff0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
14000 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
14010 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
14020 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
14030 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
14040 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
14050 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
14060 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
14070 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
14080 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
14090 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
140a0 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
140b0 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
140c0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
140d0 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
140e0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
140f0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
14100 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
14110 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
14120 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
14130 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
14140 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
14150 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
14160 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
14170 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
14180 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
14190 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
141a0 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
141b0 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
141c0 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
141d0 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
141e0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
141f0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
14200 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
14210 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
14220 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
14230 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
14240 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
14250 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
14260 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
14270 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
14280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
14290 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
142a0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
142b0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
142c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
142d0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
142e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
142f0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
14300 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
14310 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
14320 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
14330 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
14340 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
14350 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
14360 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
14370 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
14380 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14390 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
143a0 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
143b0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
143c0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
143d0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
143e0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
143f0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
14400 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
14410 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
14420 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
14430 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
14440 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
14450 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
14460 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
14470 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
14480 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
14490 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
144a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
144b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
144c0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
144d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
144e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
144f0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
14500 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
14510 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
14520 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
14530 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
14540 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
14550 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
14560 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
14570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
14580 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
14590 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
145a0 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
145b0 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
145c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
145d0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
145e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
145f0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
14600 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14610 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
14620 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
14630 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
14640 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
14650 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
14660 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
14670 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
14680 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
14690 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
146a0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
146b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
146c0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
146d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
146e0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
146f0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
14700 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
14710 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
14720 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
14730 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
14740 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
14750 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
14760 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
14770 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
14780 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
14790 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
147a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
147b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
147c0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
147d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
147e0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
147f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
14800 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
14810 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
14820 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
14830 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
14840 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
14850 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
14860 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
14870 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
14880 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
14890 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
148a0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
148b0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
148c0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
148d0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
148e0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
148f0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
14900 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
14910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
14920 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
14930 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
14940 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
14950 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
14960 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
14970 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
14980 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
14990 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
149a0 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
149b0 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
149c0 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
149d0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
149e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
149f0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
14a00 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
14a10 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
14a20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
14a30 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
14a40 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
14a50 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
14a60 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
14a70 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
14a80 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
14a90 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ab0 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
14ac0 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
14ad0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
14ae0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
14af0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
14b00 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
14b10 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
14b20 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
14b30 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
14b40 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
14b50 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
14b60 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
14b70 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
14b80 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
14b90 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14ba0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
14bb0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
14bc0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
14bd0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
14be0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
14bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
14c00 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
14c10 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
14c20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
14c30 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
14c40 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
14c50 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
14c60 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
14c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14c80 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
14c90 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
14ca0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
14cb0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
14cc0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
14cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
14ce0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
14cf0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
14d00 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
14d10 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
14d20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
14d30 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
14d40 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
14d50 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
14d60 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
14d70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
14d80 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14d90 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
14da0 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
14db0 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
14dc0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
14dd0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
14de0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
14df0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14e00 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
14e10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14e20 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
14e30 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
14e40 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
14e50 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
14e60 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
14e70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
14e80 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14e90 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
14ea0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
14ec0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
14ed0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
14ee0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
14ef0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
14f00 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
14f10 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
14f20 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
14f30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14f40 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
14f50 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
14f60 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
14f70 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
14f80 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
14f90 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
14fa0 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
14fb0 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
14fc0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
14fd0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
14fe0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14ff0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
15000 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15010 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
15020 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
15030 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
15040 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
15050 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
15060 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
15070 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
15080 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
15090 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
150a0 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
150b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
150c0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
150d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
150e0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
150f0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
15100 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
15110 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
15120 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15130 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
15140 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
15150 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
15160 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
15170 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
15180 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
15190 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
151a0 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
151b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
151c0 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
151d0 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
151e0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
151f0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
15200 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15210 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
15220 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
15230 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
15240 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
15250 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
15260 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
15270 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
15280 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
15290 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
152a0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
152b0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
152c0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
152d0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
152e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
152f0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
15300 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
15310 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
15320 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
15330 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
15340 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
15350 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
15360 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
15370 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
15380 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
15390 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
153a0 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
153b0 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
153c0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
153d0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
153e0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
153f0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
15400 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
15410 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
15420 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
15430 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20  iOrderByCol>0.  
15440 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
15450 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
15460 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
15470 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
15480 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
15490 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
154a0 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
154b0 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 73 71 6c   pKeyMerge = sql
154c0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
154d0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31  (db, nOrderBy, 1
154e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
154f0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  erge ){.      fo
15500 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
15510 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
15520 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
15530 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15540 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
15550 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
15560 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
15570 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
15580 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
15590 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
155a0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
155b0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
155c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
155d0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
155e0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
155f0 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
15600 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
15610 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
15620 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
15630 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
15640 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
15650 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
15660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15670 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
15680 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
15690 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
156a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
156b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
156c0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
156d0 62 6c 65 28 70 4b 65 79 4d 65 72 67 65 29 20 29  ble(pKeyMerge) )
156e0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
156f0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  rge->aColl[i] = 
15700 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pColl;.        p
15710 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
15720 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
15730 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
15740 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
15750 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
15760 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
15770 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
15780 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
15790 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
157a0 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
157b0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
157c0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
157d0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
157e0 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
157f0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
15800 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
15810 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
15820 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
15830 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
15840 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
15850 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
15860 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
15870 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
15880 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
15890 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
158a0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
158b0 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
158c0 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
158d0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
158e0 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
158f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
15900 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
15910 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
15920 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
15930 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
15940 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15950 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
15960 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
15970 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
15980 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
15990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159a0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
159b0 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
159c0 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
159d0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
159e0 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
159f0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
15a00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15a10 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
15a20 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
15a30 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
15a40 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
15a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
15a60 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
15a70 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
15a80 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
15a90 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
15aa0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
15ab0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
15ac0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
15ad0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
15ae0 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
15af0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
15b00 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
15b10 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
15b20 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
15b30 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
15b40 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
15b50 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
15b60 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
15b70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15b80 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
15b90 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
15ba0 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
15bb0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
15bc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
15bd0 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
15be0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
15bf0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
15c00 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
15c10 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
15c20 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
15c30 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
15c40 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
15c50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
15c60 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
15c70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
15c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c90 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
15ca0 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
15cb0 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
15cc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
15cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
15d10 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
15d20 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
15d30 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
15d40 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
15d50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
15d60 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
15d70 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
15d80 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
15d90 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
15da0 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
15db0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
15dc0 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
15dd0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15de0 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50    regEofA = ++pP
15df0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
15e00 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
15e10 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
15e20 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fB = ++pParse->n
15e30 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
15e40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15e50 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
15e60 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
15e70 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15e80 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
15e90 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
15ea0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
15eb0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
15ec0 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
15ed0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
15ee0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74  ..  /* Jump past
15ef0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62   the various sub
15f00 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72  routines and cor
15f10 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d  outines to the m
15f20 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c  ain.  ** merge l
15f30 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20  oop.  */.  j1 = 
15f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f50 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
15f60 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
15f70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15f80 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a  tAddr(v);...  /*
15f90 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
15fa0 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
15fb0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
15fc0 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
15fd0 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
15fe0 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
15ff0 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
16000 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
16010 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
16020 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
16030 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
16040 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
16050 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
16060 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
16070 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
16080 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
16090 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
160a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
160b0 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
160c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
160d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
160e0 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
160f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16100 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16110 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
16120 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
16130 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
16140 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
16150 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
16160 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
16170 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
16180 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
16190 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
161a0 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
161b0 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
161c0 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
161d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
161e0 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
161f0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
16200 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
16210 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
16220 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
16230 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
16240 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
16250 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
16260 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
16270 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
16280 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
16290 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
162a0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
162b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
162c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
162d0 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
162e0 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
162f0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
16300 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
16310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16320 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16330 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   1, regEofB);.  
16340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16350 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
16360 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65  egAddrB);.  Vdbe
16370 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
16380 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
16390 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
163a0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
163b0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
163c0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
163d0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
163e0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
163f0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
16400 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
16410 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
16420 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
16430 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
16440 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
16450 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
16460 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
16470 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
16480 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
16490 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
164a0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
164d0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
164e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
164f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
16500 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
16510 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
16520 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
16530 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
16540 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
16550 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
16560 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
16570 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
16580 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
16590 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
165a0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
165b0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
165c0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
165d0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
165e0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
165f0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
16600 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
16610 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
16620 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
16630 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
16640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
16650 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
16660 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
16670 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
16680 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
16690 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
166a0 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
166b0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
166c0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
166d0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
166e0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
166f0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
16700 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
16710 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
16720 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
16730 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
16740 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
16750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16760 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45  _Goto, 0, labelE
16770 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  nd);.  }else{  .
16780 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
16790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
167a0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
167b0 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fB, labelEnd);. 
167c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
167d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
167e0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
167f0 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utB);.    sqlite
16800 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16810 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
16820 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
16830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16840 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
16850 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
16860 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
16870 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
16880 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
16890 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
168a0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
168b0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
168c0 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
168d0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
168e0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
168f0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
16900 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
16910 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
16920 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
16930 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
16940 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
16950 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
16960 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
16970 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
16980 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
16990 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
169a0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
169b0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
169c0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
169d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
169e0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
169f0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
16a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16a10 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
16a20 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
16a30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16a40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16a50 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16a70 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16a80 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
16a90 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
16aa0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
16ab0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
16ac0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
16ad0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
16ae0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
16af0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
16b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b10 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
16b20 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
16b30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16b40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16b50 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16b70 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16b80 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
16b90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16ba0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16bb0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
16bc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
16bd0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
16be0 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
16bf0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
16c00 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
16c10 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
16c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
16c30 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
16c40 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
16c50 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
16c60 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
16c70 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
16c80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
16c90 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
16ca0 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
16cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16cc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16cd0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16cf0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
16d00 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
16d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16d30 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
16d40 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
16d50 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
16d60 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
16d70 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
16d80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16d90 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
16da0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
16db0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
16dc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16dd0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
16de0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
16df0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16e00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e10 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
16e20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
16e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e40 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16e50 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
16e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16e70 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
16e80 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73  , addrEofB);.  s
16e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16ea0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16eb0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
16ec0 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
16ed0 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
16ee0 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
16ef0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
16f00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
16f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16f20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16f30 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41  eger, 0, regEofA
16f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16f50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16f60 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42  eger, 0, regEofB
16f70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16f80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16f90 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ub, regAddrA, ad
16fa0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71  drSelectA);.  sq
16fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16fc0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
16fd0 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63  AddrB, addrSelec
16fe0 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tB);.  sqlite3Vd
16ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17000 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
17010 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
17020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17030 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
17040 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49  drEofB);..  /* I
17050 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
17060 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
17070 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
17080 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
17090 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
170a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
170b0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
170c0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
170d0 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
170e0 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
170f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17100 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
17110 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
17120 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17140 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
17150 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
17160 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
17170 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17180 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
17190 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
171a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
171b0 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
171c0 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
171d0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
171e0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
171f0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
17200 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
17210 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17220 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17230 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
17240 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
17250 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
17260 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
17270 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
17280 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
17290 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
172a0 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
172b0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
172c0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
172d0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
172e0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
172f0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
17300 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
17310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
17320 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
17330 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
17340 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
17350 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
17360 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
17370 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
17380 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
17390 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
173a0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
173b0 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
173c0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
173d0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
173e0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
173f0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
17400 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
17410 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
17420 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
17430 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
17440 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
17450 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
17460 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17470 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
17480 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17490 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
174a0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
174b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
174c0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
174d0 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
174e0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
174f0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
17500 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
17510 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
17520 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
17530 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
17540 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
17550 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
17560 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
17570 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
17580 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
17590 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
175a0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
175b0 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
175c0 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
175d0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
175e0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
175f0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
17600 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
17610 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
17620 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
17630 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17640 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
17650 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
17660 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
17670 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
17680 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
17690 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
176a0 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
176b0 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
176c0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
176d0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
176e0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
176f0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
17700 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
17710 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
17720 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
17730 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
17740 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
17750 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
17760 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
17770 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
17780 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
17790 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
177a0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
177b0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
177c0 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
177d0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
177e0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
177f0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
17800 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
17810 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
17820 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
17830 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
17840 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
17850 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
17860 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
17870 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
17880 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
17890 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
178a0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
178b0 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
178c0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
178d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
178e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
178f0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
17900 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
17910 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
17920 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
17930 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
17940 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
17950 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
17960 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
17970 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
17980 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
17990 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
179a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
179b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
179c0 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
179d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
179e0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
179f0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
17a00 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17a10 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
17a20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17a30 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
17a40 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
17a50 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
17a60 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
17a70 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
17a80 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
17a90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17aa0 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
17ab0 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
17ac0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
17ad0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
17ae0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
17af0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17b00 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17b10 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
17b20 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
17b30 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
17b40 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
17b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
17b60 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
17b70 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
17b80 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17ba0 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
17bb0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
17bc0 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
17bd0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
17be0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
17bf0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
17c00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17c10 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
17c20 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
17c30 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
17c40 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
17c50 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
17c60 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
17c70 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
17c80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
17c90 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
17ca0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
17cb0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
17cc0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
17cd0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
17ce0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
17cf0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
17d00 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
17d10 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
17d20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
17d30 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17d40 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
17d50 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
17d60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
17d70 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
17d80 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
17d90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
17da0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
17db0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17dc0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
17dd0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
17de0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
17df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17e00 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
17e10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
17e20 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
17e30 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
17e40 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
17e50 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
17e60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17e70 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
17e80 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
17e90 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17ea0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
17eb0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17ec0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17ed0 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
17ee0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17ef0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
17f00 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
17f10 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
17f20 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
17f30 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
17f40 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
17f50 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17f60 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
17f70 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
17f80 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
17f90 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
17fa0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
17fb0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
17fc0 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
17fd0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
17fe0 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
17ff0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
18000 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
18010 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
18020 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
18030 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
18040 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
18050 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
18060 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
18070 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
18080 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
18090 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
180a0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
180b0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
180c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
180d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
180e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
180f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
18100 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
18110 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
18120 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
18130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18140 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
18150 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
18160 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
18170 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
18180 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
18190 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
181a0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
181b0 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
181c0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
181d0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
181e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
181f0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
18200 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
18210 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
18220 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
18230 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
18240 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
18250 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
18260 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
18270 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
18280 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
18290 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
182a0 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
182b0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
182c0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
182d0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
182e0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
182f0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
18300 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
18310 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
18320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
18330 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
18340 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
18350 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
18360 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
18370 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
18380 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
18390 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
183a0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
183b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
183c0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
183d0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
183e0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
183f0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
18400 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
18410 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
18420 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
18430 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
18440 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
18450 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
18460 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
18470 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
18480 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
18490 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
184a0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
184b0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
184c0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
184d0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
184e0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
184f0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
18500 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
18510 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
18520 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
18530 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
18540 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
18550 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
18560 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
18570 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
18580 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
18590 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
185a0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
185b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
185c0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
185d0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
185e0 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
185f0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
18600 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
18610 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
18620 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
18630 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
18640 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
18650 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
18660 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
18670 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
18680 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
18690 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
186a0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
186b0 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
186c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
186d0 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
186e0 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
186f0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
18700 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
18710 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
18720 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
18730 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
18740 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
18750 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
18760 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
18770 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
18780 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
18790 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
187a0 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
187b0 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
187c0 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
187d0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
187e0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
187f0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
18800 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
18810 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
18820 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
18830 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18840 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
18850 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
18860 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
18870 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
18880 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
18890 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
188a0 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
188b0 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
188c0 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
188d0 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
188e0 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
188f0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
18900 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
18910 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
18920 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
18930 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
18940 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
18950 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
18960 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
18970 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18980 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
18990 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
189a0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
189b0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
189c0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
189d0 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
189e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
189f0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
18a00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
18a10 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
18a20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
18a30 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
18a40 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
18a50 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
18a60 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
18a70 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
18a80 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
18a90 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
18aa0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
18ab0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
18ac0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
18ad0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
18ae0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
18af0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
18b00 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
18b10 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
18b20 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
18b30 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
18b40 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
18b50 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
18b60 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
18b70 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
18b80 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
18b90 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
18ba0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18bb0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
18bc0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
18bd0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
18be0 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
18bf0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
18c00 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
18c10 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
18c20 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
18c30 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
18c40 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
18c50 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
18c60 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
18c70 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
18c80 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
18c90 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
18ca0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
18cb0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
18cc0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
18cd0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
18ce0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
18cf0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
18d00 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
18d10 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
18d20 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
18d30 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
18d40 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
18d50 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
18d60 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
18d70 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
18d80 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
18d90 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
18da0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
18db0 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
18dc0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
18dd0 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
18de0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
18df0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
18e00 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
18e10 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
18e20 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
18e30 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
18e40 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
18e50 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
18e60 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
18e70 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
18e80 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
18e90 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
18ea0 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
18eb0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
18ec0 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
18ed0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
18ee0 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
18ef0 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
18f00 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
18f10 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
18f20 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
18f30 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
18f40 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
18f50 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
18f60 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
18f70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
18f80 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
18f90 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
18fa0 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
18fb0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
18fc0 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
18fd0 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
18fe0 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
18ff0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
19000 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
19010 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
19020 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
19030 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
19040 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
19050 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
19060 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
19070 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
19080 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
19090 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
190a0 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
190b0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
190c0 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
190d0 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
190e0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
190f0 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
19100 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
19110 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
19120 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
19130 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
19140 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
19150 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
19160 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
19170 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
19180 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
19190 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
191a0 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
191b0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
191c0 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
191d0 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
191e0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
191f0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
19200 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
19210 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
19220 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
19230 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
19240 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
19250 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
19260 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
19270 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
19280 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
19290 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
192a0 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
192b0 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
192c0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
192d0 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
192e0 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
192f0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
19300 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
19310 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
19320 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
19330 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
19340 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
19350 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
19360 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
19370 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
19380 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
19390 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
193a0 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
193b0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
193c0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
193d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
193e0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
193f0 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
19400 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
19410 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
19420 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
19430 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  y is not a recur
19440 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
19450 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e   (23)  The paren
19460 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  t is not a recur
19470 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65  sive CTE, or the
19480 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
19490 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  t a.**        co
194a0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68  mpound query. Th
194b0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
194c0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
194d0 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
194e0 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
194f0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
19500 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
19510 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
19520 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
19530 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
19540 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
19550 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
19560 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
19570 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
19580 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
19590 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
195a0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
195b0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
195c0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
195d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
195e0 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
195f0 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
19600 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
19610 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
19620 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
19630 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
19640 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
19650 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
19660 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
19670 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
19680 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
19690 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
196a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
196b0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
196c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
196d0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
196e0 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
196f0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
19700 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
19710 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
19720 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
19730 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
19740 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
19750 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
19760 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19770 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
19780 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
19790 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
197a0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
197b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
197c0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
197d0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
197e0 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
197f0 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
19800 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
19810 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19820 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
19830 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
19840 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
19850 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
19860 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
19870 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
19880 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
19890 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
198a0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
198b0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
198c0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
198d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
198e0 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
198f0 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
19900 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
19910 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
19920 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
19930 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
19940 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
19950 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
19960 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
19970 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
19980 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
19990 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
199a0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
199b0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
199c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
199d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
199e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
199f0 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
19a00 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
19a10 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
19a20 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
19a30 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
19a40 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
19a50 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
19a60 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
19a70 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19a80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
19a90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
19aa0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ac0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
19ad0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
19ae0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
19af0 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
19b00 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
19b10 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
19b20 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
19b30 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
19b40 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
19b50 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
19b60 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
19b70 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
19b80 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
19b90 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
19ba0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
19bb0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
19bc0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
19bd0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
19be0 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
19bf0 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
19c00 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
19c10 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
19c20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
19c30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
19c40 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
19c50 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
19c60 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
19c70 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
19c80 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
19c90 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
19ca0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
19cb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
19cc0 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
19cd0 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19cf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
19d00 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
19d10 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
19d20 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
19d30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
19d40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
19d50 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
19d60 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
19d70 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
19d80 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
19d90 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
19da0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
19db0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
19dc0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
19dd0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
19de0 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
19df0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
19e00 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
19e10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
19e20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
19e30 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
19e40 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
19e50 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
19e60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
19e70 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
19e80 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
19e90 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
19ea0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
19eb0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
19ec0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
19ed0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
19ee0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
19ef0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19f00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19f10 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
19f20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
19f30 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19f60 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
19f70 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
19f80 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
19f90 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
19fa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19fd0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
19fe0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
19ff0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1a000 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1a030 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1a040 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1a050 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1a060 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1a070 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1a080 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
1a090 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1a0a0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1a0b0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1a0c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1a0d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1a0e0 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1a0f0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1a100 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1a110 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
1a120 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
1a130 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1a140 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
1a150 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
1a160 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1a170 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1a180 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1a1c0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1a1d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1a1e0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1a1f0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a210 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1a220 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1a230 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1a240 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a260 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1a270 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1a280 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1a290 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1a2a0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1a2b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1a2c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a2d0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1a2e0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1a2f0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1a300 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
1a310 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a320 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a  iction (22)  */.
1a330 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1a340 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1a350 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  e) && pSub->pPri
1a360 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
1a370 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f       /* (23)  */
1a380 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
1a390 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
1a3a0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
1a3b0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1a3c0 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
1a3d0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1a3e0 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
1a3f0 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
1a400 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
1a410 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
1a420 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1a430 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
1a440 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1a450 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1a460 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1a470 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1a480 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1a490 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1a4a0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1a4b0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1a4c0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1a4d0 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1a4e0 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1a4f0 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1a500 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1a510 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1a520 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
1a530 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
1a540 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1a550 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1a560 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1a570 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
1a580 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1a590 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
1a5a0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
1a5b0 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
1a5c0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
1a5d0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1a5e0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1a5f0 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
1a600 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1a610 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
1a620 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1a630 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1a640 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1a650 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1a660 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1a670 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
1a680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
1a690 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
1a6a0 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
1a6b0 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
1a6c0 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
1a6d0 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
1a6e0 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
1a6f0 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
1a700 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
1a710 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
1a720 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1a730 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
1a740 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
1a750 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
1a760 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
1a770 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1a780 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
1a790 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
1a7a0 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
1a7b0 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
1a7c0 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
1a7d0 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
1a7e0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1a7f0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1a800 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
1a810 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1a820 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1a830 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1a840 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1a850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
1a860 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
1a870 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1a880 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1a890 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
1a8a0 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
1a8b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1a8c0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
1a8d0 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
1a8e0 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
1a8f0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1a900 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1a910 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1a920 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
1a930 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
1a940 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
1a950 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
1a960 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
1a970 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1a980 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1a990 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
1a9a0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1a9b0 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1a9c0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1a9d0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1a9e0 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1a9f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1aa00 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1aa10 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1aa20 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1aa30 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1aa40 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1aa50 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1aa60 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1aa70 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1aa80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1aa90 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1aaa0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1aab0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1aac0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1aad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1aae0 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1aaf0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
1ab00 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1ab10 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1ab20 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
1ab30 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
1ab40 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
1ab50 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
1ab60 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1ab70 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
1ab80 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73    || pSub->pELis
1ab90 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d  t->nExpr!=pSub1-
1aba0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
1abb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1abc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1abd0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1abe0 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1abf0 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1ac00 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ac10 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1ac20 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1ac30 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1ac40 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1ac50 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1ac60 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1ac70 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1ac80 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1ac90 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1aca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1acb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1acc0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1acd0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1ace0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1acf0 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a  mitted. *****/..
1ad00 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1ad10 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ad20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ad30 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1ad40 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1ad50 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1ad60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ad70 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1ad80 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1ad90 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1ada0 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1adb0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1adc0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1add0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1ade0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1adf0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ae00 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1ae10 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1ae20 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1ae30 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1ae40 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1ae50 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1ae60 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1ae70 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1ae80 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1ae90 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1aea0 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1aeb0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1aec0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1aed0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1aee0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1aef0 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1af00 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1af10 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1af20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1af30 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1af40 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1af50 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1af60 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1af70 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1af80 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1af90 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1afa0 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1afb0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1afc0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1afd0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1afe0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1aff0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1b000 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1b010 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1b020 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1b030 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1b040 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1b050 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1b060 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1b070 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1b080 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1b090 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1b0a0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1b0b0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1b0c0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1b0d0 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1b0e0 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1b0f0 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1b100 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1b110 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1b120 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1b130 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1b140 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1b150 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1b160 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1b170 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1b180 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1b190 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1b1a0 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1b1b0 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1b1c0 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1b1d0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1b1e0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1b1f0 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1b200 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1b210 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1b220 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1b230 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1b240 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1b250 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1b260 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1b270 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1b280 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1b290 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1b2a0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1b2b0 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1b2c0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1b2d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1b2e0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1b2f0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1b300 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1b310 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1b320 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1b330 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1b340 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1b350 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1b360 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1b370 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  p, 0);.    p->pO
1b380 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1b390 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1b3a0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1b3b0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1b3c0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1b3d0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1b3e0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1b3f0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d   p->pRightmost =
1b400 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   0;.    if( pNew
1b410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
1b420 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  w = pPrior;.    
1b430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1b440 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1b450 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  or;.      pNew->
1b460 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
1b470 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72      }.    p->pPr
1b480 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1b490 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1b4a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1b4b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1b4c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1b4d0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1b4e0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1b4f0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1b500 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1b510 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1b520 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1b530 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1b540 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1b550 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1b560 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b570 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1b580 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1b590 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1b5a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1b5b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1b5c0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1b5d0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1b5e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1b5f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1b600 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1b610 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1b620 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1b630 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1b640 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1b650 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1b660 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1b670 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1b680 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1b690 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1b6a0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
1b6b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
1b6c0 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
1b6d0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
1b6e0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
1b6f0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
1b700 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
1b710 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
1b720 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
1b730 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
1b740 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
1b750 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
1b760 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
1b770 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
1b780 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
1b790 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
1b7a0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
1b7b0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
1b7c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
1b7d0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
1b7e0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
1b7f0 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
1b800 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
1b810 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1b820 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1b830 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
1b840 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
1b850 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
1b860 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
1b870 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1b880 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
1b890 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
1b8a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
1b8b0 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
1b8c0 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
1b8d0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
1b8e0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1b8f0 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
1b900 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
1b910 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
1b920 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
1b930 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
1b940 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
1b950 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1b960 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
1b970 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
1b980 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
1b990 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
1b9a0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1b9b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
1b9c0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
1b9d0 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
1b9e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1b9f0 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
1ba00 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
1ba10 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
1ba20 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1ba30 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1ba40 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1ba50 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
1ba60 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
1ba70 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
1ba80 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1ba90 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
1baa0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
1bab0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
1bac0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
1bad0 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
1bae0 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
1baf0 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
1bb00 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1bb10 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1bb20 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1bb30 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1bb40 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
1bb50 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
1bb60 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1bb70 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
1bb80 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
1bb90 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1bba0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1bbb0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
1bbc0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
1bbd0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
1bbe0 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
1bbf0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1bc00 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
1bc10 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
1bc20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
1bc30 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
1bc40 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1bc50 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
1bc60 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
1bc70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
1bc80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1bc90 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
1bca0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1bcb0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1bcc0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1bcd0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1bce0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1bcf0 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
1bd00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bd10 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
1bd20 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
1bd30 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1bd40 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
1bd50 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
1bd60 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
1bd70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1bd80 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
1bd90 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
1bda0 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
1bdb0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1bdc0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1bdd0 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
1bde0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1bdf0 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
1be00 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1be10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1be20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1be30 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
1be40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1be50 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
1be60 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
1be70 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
1be80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1be90 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
1bea0 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
1beb0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
1bec0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
1bed0 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
1bee0 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
1bef0 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
1bf00 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
1bf10 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
1bf20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
1bf30 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
1bf40 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1bf50 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1bf60 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1bf70 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1bf80 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
1bf90 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
1bfa0 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
1bfb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
1bfc0 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
1bfd0 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
1bfe0 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
1bff0 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
1c000 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
1c010 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
1c020 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
1c030 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
1c040 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
1c050 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
1c060 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79  nd the out query
1c070 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68   to 4 slots.  Th
1c080 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20  e middle.    ** 
1c090 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
1c0a0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
1c0b0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
1c0c0 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  pace for the.   
1c0d0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1c0e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1c0f0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1c100 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1c110 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
1c120 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1c130 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
1c140 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1c150 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
1c160 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
1c170 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1c180 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1c190 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c1a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1c1b0 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
1c1c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1c1d0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
1c1e0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1c1f0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1c200 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1c210 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
1c220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1c230 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1c240 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
1c250 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
1c260 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
1c270 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
1c280 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
1c290 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
1c2a0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
1c2b0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
1c2c0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
1c2d0 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
1c2e0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
1c2f0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
1c300 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
1c310 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
1c320 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
1c330 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
1c340 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
1c350 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
1c360 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
1c370 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1c380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c390 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
1c3a0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
1c3b0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
1c3c0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
1c3d0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
1c3e0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1c3f0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1c400 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
1c410 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
1c420 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
1c430 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c440 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
1c450 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
1c460 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c470 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
1c480 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
1c490 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
1c4a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1c4b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1c4c0 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
1c4d0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1c4e0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
1c4f0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
1c500 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
1c510 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
1c520 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
1c530 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
1c540 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1c550 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1c560 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1c570 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
1c580 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1c590 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
1c5a0 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
1c5b0 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
1c5c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
1c5d0 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
1c5e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1c5f0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
1c600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c610 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1c620 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
1c630 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
1c640 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1c650 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
1c660 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c670 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
1c680 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
1c690 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1c6a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c6b0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1c6c0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1c6d0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1c6e0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1c6f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c700 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1c710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c720 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1c730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1c740 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
1c750 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
1c760 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
1c770 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
1c780 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
1c790 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1c7a0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c7b0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1c7c0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
1c7d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1c7e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c7f0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
1c800 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71       pWhere = sq
1c810 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1c820 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
1c830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c840 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
1c850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
1c860 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1c870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c880 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
1c890 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1c8a0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
1c8b0 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
1c8c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1c8d0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
1c8e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1c8f0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1c900 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1c910 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1c920 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1c930 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1c940 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
1c950 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1c960 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1c9a0 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
1c9b0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
1c9c0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
1c9d0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
1c9e0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
1c9f0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
1ca00 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
1ca10 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
1ca20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ca30 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1ca40 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
1ca50 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1ca60 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
1ca70 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1ca80 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1ca90 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
1caa0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
1cab0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
1cac0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1cad0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
1cae0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1caf0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
1cb00 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
1cb10 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
1cb20 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
1cb30 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
1cb40 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
1cb50 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1cb60 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
1cb70 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
1cb80 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
1cb90 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
1cba0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
1cbb0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
1cbc0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
1cbd0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
1cbe0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
1cbf0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
1cc00 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
1cc10 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
1cc20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
1cc30 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
1cc40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cc50 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1cc60 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1cc70 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
1cc80 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
1cc90 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
1cca0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1ccb0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
1ccc0 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
1ccd0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
1cce0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
1ccf0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
1cd00 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1cd10 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20  (db, pSub1);..  
1cd20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
1cd30 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1cd40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1cd50 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1cd60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1cd70 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73  W) */../*.** Bas
1cd80 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
1cd90 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66  ts of the AggInf
1cda0 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  o structure indi
1cdb0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
1cdc0 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20  st.** argument, 
1cdd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
1cde0 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ecks if the foll
1cdf0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1ce00 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71  **.**    * the q
1ce10 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75  uery contains ju
1ce20 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72  st a single aggr
1ce30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a  egate function,.
1ce40 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72  **    * the aggr
1ce50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1ce60 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f  s either min() o
1ce70 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20  r max(), and.** 
1ce80 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e     * the argumen
1ce90 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
1cea0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
1ceb0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a   column value..*
1cec0 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
1ced0 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75  he above are tru
1cee0 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52  e, then WHERE_OR
1cef0 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
1cf00 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a  RE_ORDERBY_MAX.*
1cf10 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  * is returned as
1cf20 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c   appropriate. Al
1cf30 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  so, *ppMinMax is
1cf40 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1cf50 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66   the .** list of
1cf60 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
1cf70 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  d to the aggrega
1cf80 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  te before return
1cf90 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ing..**.** Or, i
1cfa0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  f the conditions
1cfb0 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d   above are not m
1cfc0 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  et, *ppMinMax is
1cfd0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
1cfe0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1cff0 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65  ORMAL is returne
1d000 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  d..*/.static u8 
1d010 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49  minMaxQuery(AggI
1d020 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45  nfo *pAggInfo, E
1d030 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
1d040 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
1d050 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
1d060 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20  NORMAL;         
1d070 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1d080 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78   */..  *ppMinMax
1d090 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67   = 0;.  if( pAgg
1d0a0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29  Info->nFunc==1 )
1d0b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1d0c0 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  r = pAggInfo->aF
1d0d0 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a  unc[0].pExpr; /*
1d0e0 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
1d0f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  ion */.    ExprL
1d100 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45  ist *pEList = pE
1d110 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
1d120 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
1d130 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
1d140 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
1d150 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
1d160 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
1d170 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
1d180 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
1d190 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
1d1a0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  .pExpr->op==TK_A
1d1b0 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
1d1c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d1d0 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e  Func = pExpr->u.
1d1e0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  zToken;.      if
1d1f0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1d200 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
1d210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
1d220 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1d230 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MIN;.        *
1d240 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
1d250 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
1d260 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1d270 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
1d280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
1d290 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1d2a0 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  BY_MAX;.        
1d2b0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
1d2c0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
1d2d0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1d2e0 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c   *ppMinMax==0 ||
1d2f0 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45   (*ppMinMax)->nE
1d300 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  xpr==1 );.  retu
1d310 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
1d320 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
1d330 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
1d340 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1d350 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
1d360 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
1d370 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74  e second argment
1d380 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
1d390 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
1d3a0 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
1d3b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
1d3c0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
1d3d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1d3e0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
1d3f0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
1d400 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
1d410 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
1d420 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
1d430 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
1d440 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
1d450 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
1d460 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
1d470 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1d480 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1d490 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
1d4a0 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
1d4b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
1d4c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d4d0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
1d4e0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
1d4f0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
1d500 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
1d510 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
1d520 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
1d530 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
1d540 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
1d550 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
1d560 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
1d570 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
1d580 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
1d590 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
1d5a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1d5b0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
1d5c0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
1d5d0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
1d5e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1d5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
1d600 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
1d610 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
1d620 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1d630 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
1d640 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
1d650 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
1d660 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
1d670 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
1d680 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
1d690 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1d6a0 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
1d6b0 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
1d6c0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
1d6d0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
1d6e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1d6f0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
1d700 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1d710 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
1d720 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
1d730 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
1d740 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
1d750 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
1d760 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
1d770 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
1d780 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
1d790 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
1d7a0 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
1d7b0 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
1d7c0 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
1d7d0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1d7e0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
1d7f0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
1d800 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
1d810 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
1d820 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
1d830 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
1d840 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
1d850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d860 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1d870 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1d880 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d890 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d8a0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
1d8b0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
1d8c0 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
1d8d0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1d8e0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1d8f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
1d900 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
1d910 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
1d920 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1d930 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1d940 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
1d950 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d960 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
1d970 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
1d980 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
1d990 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1d9a0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
1d9b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d9c0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1d9d0 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
1d9e0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  x, 0);.      pPa
1d9f0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1da00 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1da10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1da20 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
1da30 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  ->pIndex = pIdx;
1da40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1da50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
1da60 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64   Detect compound
1da70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1da80 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f  ts that use an O
1da90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77  RDER BY clause w
1daa0 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72  ith .** an alter
1dab0 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67  native collating
1dac0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
1dad0 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46      SELECT ... F
1dae0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
1daf0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
1db00 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c   ORDER BY .. COL
1db10 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
1db20 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74  hese are rewritt
1db30 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79  en as a subquery
1db40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
1db50 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
1db60 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
1db70 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
1db80 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f  ROM t2).**     O
1db90 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c  RDER BY ... COLL
1dba0 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
1dbb0 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  is transformatio
1dbc0 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  n is necessary b
1dbd0 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69  ecause the multi
1dbe0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
1dbf0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65  routine.** above
1dc00 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20   that generates 
1dc10 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63  the code for a c
1dc20 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77  ompound SELECT w
1dc30 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
1dc40 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61  clause.** uses a
1dc50 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1dc60 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
1dc70 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e  he same collatin
1dc80 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68  g sequence on th
1dc90 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  e.** result colu
1dca0 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52  mns as on the OR
1dcb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1dcc0 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74  See ticket.** ht
1dcd0 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
1dce0 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30  org/src/info/670
1dcf0 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68  9574d2a.**.** Th
1dd00 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  is transformatio
1dd10 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  n is only needed
1dd20 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54   for EXCEPT, INT
1dd30 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f  ERSECT, and UNIO
1dd40 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20  N..** The UNION 
1dd50 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72  ALL operator wor
1dd60 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c  ks fine with mul
1dd70 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1dd80 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74  ) even when.** t
1dd90 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45  here are COLLATE
1dda0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1ddb0 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69  DER BY..*/.stati
1ddc0 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d  c int convertCom
1ddd0 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62  poundSelectToSub
1dde0 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57  query(Walker *pW
1ddf0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1de00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65  ){.  int i;.  Se
1de10 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65  lect *pNew;.  Se
1de20 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69  lect *pX;.  sqli
1de30 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63  te3 *db;.  struc
1de40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1de50 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *a;.  SrcList *p
1de60 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20  NewSrc;.  Parse 
1de70 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e  *pParse;.  Token
1de80 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70   dummy;..  if( p
1de90 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
1dea0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1deb0 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  e;.  if( p->pOrd
1dec0 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
1ded0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1dee0 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26   for(pX=p; pX &&
1def0 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   (pX->op==TK_ALL
1df00 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53   || pX->op==TK_S
1df10 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70  ELECT); pX=pX->p
1df20 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70  Prior){}.  if( p
1df30 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  X==0 ) return WR
1df40 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20  C_Continue;.  a 
1df50 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  = p->pOrderBy->a
1df60 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72  ;.  for(i=p->pOr
1df70 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  derBy->nExpr-1; 
1df80 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
1df90 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  if( a[i].pExpr->
1dfa0 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
1dfb0 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  te ) break;.  }.
1dfc0 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
1dfd0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1dfe0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
1dff0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
1e000 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72  hat means the tr
1e010 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
1e020 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20  required. */..  
1e030 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1e040 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
1e050 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
1e060 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1e070 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1e080 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1e090 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1e0a0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1e0b0 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
1e0c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
1e0d0 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d  y));.  pNewSrc =
1e0e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e0f0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50  ppendFromTerm(pP
1e100 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d  arse,0,0,0,&dumm
1e110 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69  y,pNew,0,0);.  i
1e120 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20  f( pNewSrc==0 ) 
1e130 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1e140 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a  ;.  *pNew = *p;.
1e150 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77    p->pSrc = pNew
1e160 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74  Src;.  p->pEList
1e170 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1e180 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1e190 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28   0, sqlite3Expr(
1e1a0 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b  db, TK_ALL, 0));
1e1b0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
1e1c0 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
1e1d0 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
1e1e0 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
1e1f0 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
1e200 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
1e210 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
1e220 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ior = 0;.  pNew-
1e230 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
1e240 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
1e250 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1e260 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e  ontinue;.}..#ifn
1e270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e280 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
1e290 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
1e2a0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
1e2b0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
1e2c0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
1e2d0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
1e2e0 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
1e2f0 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
1e300 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
1e310 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
1e320 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
1e330 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
1e340 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
1e350 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
1e360 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
1e370 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
1e380 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
1e390 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
1e3a0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
1e3b0 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
1e3c0 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
1e3d0 61 72 63 68 57 69 74 68 28 57 69 74 68 20 2a 70  archWith(With *p
1e3e0 57 69 74 68 2c 20 73 74 72 75 63 74 20 53 72 63  With, struct Src
1e3f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e400 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1e410 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
1e420 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
1e430 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
1e440 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
1e450 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
1e460 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
1e470 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
1e480 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1e490 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1e4a0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
1e4b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e4c0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
1e4d0 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
1e4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1e4f0 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
1e500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e510 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1e520 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
1e530 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1e540 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
1e550 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
1e560 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
1e570 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
1e580 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
1e590 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
1e5a0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
1e5b0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1e5c0 20 70 75 73 68 20 61 6e 64 20 70 75 6c 6c 20 57   push and pull W
1e5d0 49 54 48 20 63 6c 61 75 73 65 73 20 6f 6e 20 74  ITH clauses on t
1e5e0 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  he stack..*/.voi
1e5f0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
1e600 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1e610 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
1e620 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
1e630 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
1e640 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
1e650 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
1e660 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  th = pWith;.  }.
1e670 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75  }../*.** If argu
1e680 6d 65 6e 74 20 70 43 74 65 20 69 73 20 6e 6f 74  ment pCte is not
1e690 20 4e 55 4c 4c 2c 20 63 68 65 63 6b 20 69 66 20   NULL, check if 
1e6a0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  it is already a 
1e6b0 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73  part of the.** s
1e6c0 74 61 63 6b 20 6f 66 20 43 54 45 73 20 73 74 6f  tack of CTEs sto
1e6d0 72 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  red by the parse
1e6e0 72 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20 69  r. If so, this i
1e6f0 6e 64 69 63 61 74 65 73 20 61 6e 20 69 6c 6c 65  ndicates an ille
1e700 67 61 6c 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  gal.** recursive
1e710 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
1e720 43 54 45 2c 20 73 65 74 20 6f 66 20 6d 75 74 75  CTE, set of mutu
1e730 61 6c 6c 79 20 72 65 63 75 72 73 69 76 65 20 43  ally recursive C
1e740 54 45 73 2e 20 53 74 6f 72 65 0a 2a 2a 20 61 6e  TEs. Store.** an
1e750 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 61   error in the pa
1e760 72 73 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rser and return 
1e770 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
1e780 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1e790 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1e7a0 65 2c 20 69 66 20 70 43 74 65 20 69 73 20 6e 6f  e, if pCte is no
1e7b0 74 20 61 6c 72 65 61 64 79 20 70 61 72 74 20 6f  t already part o
1e7c0 66 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20 43  f the stack of C
1e7d0 54 45 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  TEs stored.** in
1e7e0 20 74 68 65 20 70 61 72 73 65 72 2c 20 70 75 73   the parser, pus
1e7f0 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  h it onto the st
1e800 6f 70 20 6f 66 20 74 68 61 74 20 73 74 61 63 6b  op of that stack
1e810 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1e820 20 63 74 65 50 75 73 68 28 50 61 72 73 65 20 2a   ctePush(Parse *
1e830 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 43  pParse, struct C
1e840 74 65 20 2a 70 43 74 65 29 7b 0a 20 20 69 66 28  te *pCte){.  if(
1e850 20 70 43 74 65 20 29 7b 0a 20 20 20 20 73 74 72   pCte ){.    str
1e860 75 63 74 20 43 74 65 20 2a 70 3b 0a 20 20 20 20  uct Cte *p;.    
1e870 66 6f 72 28 70 3d 70 50 61 72 73 65 2d 3e 70 43  for(p=pParse->pC
1e880 74 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  te; p; p=p->pOut
1e890 65 72 43 74 65 29 7b 0a 20 20 20 20 20 20 69 66  erCte){.      if
1e8a0 28 20 70 3d 3d 70 43 74 65 20 29 7b 0a 20 20 20  ( p==pCte ){.   
1e8b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1e8c0 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
1e8d0 20 20 70 50 61 72 73 65 2c 20 22 69 6c 6c 65 67    pParse, "illeg
1e8e0 61 6c 20 72 65 63 75 72 73 69 76 65 20 64 65 66  al recursive def
1e8f0 69 6e 69 6e 69 74 69 6f 6e 20 69 6e 20 63 74 65  ininition in cte
1e900 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
1e910 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
1e920 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e930 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1e940 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20   }.    }.    .  
1e950 20 20 70 43 74 65 2d 3e 70 4f 75 74 65 72 43 74    pCte->pOuterCt
1e960 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 74 65  e = pParse->pCte
1e970 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 43  ;.    pParse->pC
1e980 74 65 20 3d 20 70 43 74 65 3b 0a 20 20 7d 0a 20  te = pCte;.  }. 
1e990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e9a0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  K;.}./*.** If ar
1e9b0 67 75 6d 65 6e 74 20 70 43 74 65 20 69 73 20 6e  gument pCte is n
1e9c0 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
1e9d0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
1e9e0 20 74 68 65 20 43 54 45 20 63 75 72 72 65 6e 74   the CTE current
1e9f0 6c 79 0a 2a 2a 20 6f 6e 20 74 6f 70 20 6f 66 20  ly.** on top of 
1ea00 74 68 65 20 73 74 61 63 6b 20 6f 66 20 43 54 45  the stack of CTE
1ea10 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1ea20 70 61 72 73 65 72 2e 20 52 65 6d 6f 76 65 20 69  parser. Remove i
1ea30 74 20 66 72 6f 6d 20 74 68 61 74 0a 2a 2a 20 73  t from that.** s
1ea40 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
1ea50 76 6f 69 64 20 63 74 65 50 6f 70 28 50 61 72 73  void ctePop(Pars
1ea60 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
1ea70 74 20 43 74 65 20 2a 70 43 74 65 29 7b 0a 20 20  t Cte *pCte){.  
1ea80 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
1ea90 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1eaa0 70 43 74 65 3d 3d 70 43 74 65 20 29 3b 0a 20 20  pCte==pCte );.  
1eab0 20 20 70 50 61 72 73 65 2d 3e 70 43 74 65 20 3d    pParse->pCte =
1eac0 20 70 43 74 65 2d 3e 70 4f 75 74 65 72 43 74 65   pCte->pOuterCte
1ead0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1eae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
1eaf0 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
1eb00 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
1eb10 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
1eb20 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
1eb30 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
1eb40 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
1eb50 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
1eb60 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
1eb70 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
1eb80 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
1eb90 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
1eba0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
1ebb0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1ebc0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
1ebd0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
1ebe0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
1ebf0 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
1ec00 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
1ec10 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
1ec20 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
1ec30 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
1ec40 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
1ec50 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
1ec60 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
1ec70 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
1ec80 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
1ec90 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
1eca0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
1ecb0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
1ecc0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
1ecd0 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
1ece0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
1ecf0 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
1ed00 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
1ed10 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
1ed20 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
1ed30 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
1ed40 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
1ed50 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1ed60 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
1ed70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1ed80 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
1ed90 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
1eda0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
1edb0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1edc0 46 72 6f 6d 0a 29 7b 0a 20 20 54 61 62 6c 65 20  From.){.  Table 
1edd0 2a 70 54 61 62 3b 0a 20 20 50 61 72 73 65 20 2a  *pTab;.  Parse *
1ede0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1edf0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
1ee00 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ee10 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
1ee20 74 65 20 2a 70 43 74 65 3b 0a 0a 20 20 61 73 73  te *pCte;..  ass
1ee30 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1ee40 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
1ee50 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
1ee60 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
1ee70 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b  );.  if( pCte ){
1ee80 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ee90 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63  EList;.    Selec
1eea0 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c  t *pSel;.    Sel
1eeb0 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ect *pLeft;     
1eec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1eed0 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ft-most SELECT s
1eee0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
1eef0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1ef00 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
1ef10 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1ef20 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
1ef30 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1ef40 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1ef50 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
1ef60 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
1ef70 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1ef80 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
1ef90 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
1efa0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
1efb0 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
1efc0 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36  RowEst = 1048576
1efd0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
1efe0 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
1eff0 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  eral;.    pFrom-
1f000 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
1f010 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1f020 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
1f030 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
1f040 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1f050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f060 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  M;.    assert( p
1f070 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b  From->pSelect );
1f080 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
1f090 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75  f this is a recu
1f0a0 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20  rsive CTE. */.  
1f0b0 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
1f0c0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
1f0d0 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
1f0e0 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
1f0f0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
1f100 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
1f110 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
1f120 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
1f130 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
1f140 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
1f150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
1f160 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f170 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
1f180 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
1f190 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
1f1a0 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
1f1b0 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
1f1c0 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
1f1d0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
1f1e0 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
1f1f0 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
1f200 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1f210 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
1f220 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
1f230 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65       pItem->isRe
1f240 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
1f250 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65         pTab->nRe
1f260 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
1f270 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
1f280 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
1f290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f2a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
1f2b0 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
1f2c0 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
1f2d0 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
1f2e0 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
1f2f0 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >2 ){.      sqli
1f300 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
1f310 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22         pParse, "
1f320 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
1f330 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 69 6e  ve references in
1f340 20 63 74 65 3a 20 25 73 22 2c 20 70 43 74 65 2d   cte: %s", pCte-
1f350 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
1f360 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1f370 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
1f380 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
1f390 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
1f3a0 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
1f3b0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
1f3c0 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
1f3d0 20 20 20 20 69 66 28 20 63 74 65 50 75 73 68 28      if( ctePush(
1f3e0 70 50 61 72 73 65 2c 20 70 43 74 65 29 20 29 20  pParse, pCte) ) 
1f3f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1f400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
1f410 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1f420 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 3f   pTab->nRef==2 ?
1f430 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
1f440 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
1f450 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
1f460 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
1f470 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
1f480 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
1f490 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
1f4a0 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
1f4b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
1f4c0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
1f4d0 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
1f4e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f4f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f500 65 2c 20 22 63 74 65 20 5c 22 25 73 5c 22 20 72  e, "cte \"%s\" r
1f510 65 74 75 72 6e 73 20 25 64 20 76 61 6c 75 65 73  eturns %d values
1f520 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
1f530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
1f540 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
1f550 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
1f560 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
1f570 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f580 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1f590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f5a0 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
1f5b0 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cols;.    }.    
1f5c0 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
1f5d0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1f5e0 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
1f5f0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1f600 6f 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ol);..    if( pS
1f610 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
1f620 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 73 71  F_Recursive ) sq
1f630 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1f640 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
1f650 20 20 20 20 63 74 65 50 6f 70 28 70 50 61 72 73      ctePop(pPars
1f660 65 2c 20 70 43 74 65 29 3b 0a 20 20 7d 0a 0a 20  e, pCte);.  }.. 
1f670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f680 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1f690 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f6a0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
1f6b0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
1f6c0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
1f6d0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
1f6e0 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
1f6f0 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
1f700 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
1f710 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
1f720 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1f730 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1f740 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
1f750 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
1f760 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f770 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
1f780 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
1f790 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
1f7a0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
1f7b0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
1f7c0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
1f7d0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
1f7e0 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
1f7f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f800 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
1f810 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
1f820 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
1f830 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
1f840 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
1f850 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
1f860 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
1f870 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
1f880 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
1f890 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1f8a0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
1f8b0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
1f8c0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
1f8d0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
1f8e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
1f8f0 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
1f900 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
1f910 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
1f920 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
1f930 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
1f940 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
1f950 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
1f960 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f970 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
1f980 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1f990 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
1f9a0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
1f9b0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f9c0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
1f9d0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
1f9e0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
1f9f0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1fa00 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
1fa10 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
1fa20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
1fa30 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
1fa40 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
1fa50 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
1fa60 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
1fa70 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
1fa80 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1fa90 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
1faa0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
1fab0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
1fac0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1fad0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
1fae0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
1faf0 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
1fb00 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1fb10 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1fb20 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1fb30 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
1fb40 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
1fb50 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
1fb60 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
1fb70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1fb80 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
1fb90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1fba0 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
1fbb0 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
1fbc0 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
1fbd0 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
1fbe0 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
1fbf0 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
1fc00 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
1fc10 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
1fc20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1fc30 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
1fc40 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
1fc50 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
1fc60 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
1fc70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1fc80 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
1fc90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1fca0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1fcb0 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
1fcc0 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
1fcd0 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1fce0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1fcf0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
1fd00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fd10 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1fd20 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
1fd30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1fd40 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1fd50 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
1fd60 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
1fd70 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
1fd80 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1fd90 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
1fda0 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
1fdb0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1fdc0 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
1fdd0 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
1fde0 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
1fdf0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
1fe00 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
1fe10 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
1fe20 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
1fe30 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
1fe40 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1fe50 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1fe60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1fe70 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1fe80 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1fe90 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1fea0 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
1feb0 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b  | pFrom->pTab );
1fec0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1fed0 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
1fee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1fef0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
1ff00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1ff10 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
1ff20 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
1ff30 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
1ff40 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
1ff50 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
1ff60 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1ff70 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  i==0 );.      re
1ff80 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1ff90 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1ffa0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
1ffb0 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
1ffc0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
1ffd0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1ffe0 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
1fff0 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
20000 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
20010 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
20020 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
20030 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20040 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
20050 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
20060 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
20070 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
20080 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
20090 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
200a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
200b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
200c0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
200d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
200e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
200f0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
20100 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
20110 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
20120 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
20130 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
20140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
20150 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
20160 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
20170 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
20180 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
20190 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
201a0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
201b0 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
201c0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
201d0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
201e0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
201f0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
20200 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
20210 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
20220 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
20230 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
20240 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
20250 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
20260 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
20270 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20  Est = 1048576;. 
20280 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
20290 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
202a0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
202b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
202c0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
202d0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
202e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
202f0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
20300 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
20310 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
20320 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
20330 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
20340 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
20350 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
20360 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
20370 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
20380 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
20390 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
203a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
203b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
203c0 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
203d0 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
203e0 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
203f0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
20400 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
20410 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
20420 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
20430 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
20440 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
20450 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
20460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20470 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
20480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
20490 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
204a0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
204b0 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
204c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
204d0 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
204e0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
204f0 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
20500 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
20510 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
20520 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
20530 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
20540 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
20550 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20560 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
20570 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
20580 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
20590 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
205a0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
205b0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
205c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
205d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
205e0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
205f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
20600 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
20610 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
20620 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
20630 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
20640 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
20650 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
20660 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
20670 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
20680 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
20690 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
206a0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
206b0 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
206c0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
206d0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
206e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
206f0 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
20700 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
20710 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
20720 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
20730 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
20740 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
20750 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
20760 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
20770 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
20780 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
20790 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
207a0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
207b0 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
207c0 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
207d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
207e0 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
207f0 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
20800 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
20810 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
20820 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
20830 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
20840 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
20850 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
20860 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
20870 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
20880 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
20890 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
208a0 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
208b0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
208c0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
208d0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
208e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
208f0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
20900 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
20910 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
20920 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
20930 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
20940 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
20950 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
20960 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
20970 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
20980 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
20990 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
209a0 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
209b0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
209c0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
209d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
209e0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
209f0 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
20a00 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
20a10 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
20a20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
20a30 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
20a40 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  ht->op==TK_ALL )
20a50 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
20a60 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
20a70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
20a80 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
20a90 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
20aa0 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
20ab0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
20ac0 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
20ad0 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
20ae0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
20af0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
20b00 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
20b10 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
20b20 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
20b30 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
20b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
20b50 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20b60 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
20b70 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
20b80 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
20b90 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
20ba0 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
20bb0 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
20bc0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20bd0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
20be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bf0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
20c00 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
20c10 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
20c20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73    /* When proces
20c30 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65  sing FROM-clause
20c40 20 73 75 62 71 75 65 72 69 65 73 2c 20 69 74 20   subqueries, it 
20c50 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
20c60 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66  se.    ** that f
20c70 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
20c80 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63  =OFF and short_c
20c90 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20  olumn_names=ON. 
20ca0 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   The.    ** sqli
20cb0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
20cc0 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d  lect() routine m
20cd0 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20  akes it so. */. 
20ce0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
20cf0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
20d00 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20  tedFrom)==0.    
20d10 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
20d20 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
20d30 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20  lNames)==0 &&.  
20d40 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
20d50 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
20d60 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29  tColNames)!=0) )
20d70 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
20d80 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
20d90 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
20da0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
20db0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
20dc0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
20dd0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
20de0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
20df0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
20e00 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
20e10 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
20e20 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
20e30 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
20e40 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
20e50 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
20e60 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
20e70 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
20e80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20e90 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
20ea0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
20eb0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
20ec0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
20ed0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
20ee0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
20ef0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
20f00 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
20f10 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
20f20 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
20f30 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
20f40 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
20f50 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
20f60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
20f70 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
20f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
20f90 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
20fa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20fb0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
20fc0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
20fd0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
20fe0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
20ff0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
21000 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
21010 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
21020 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
21030 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
21040 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
21050 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
21060 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
21070 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
21080 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
21090 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
210a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
210b0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
210c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
210d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
210e0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
210f0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
21100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
21110 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
21120 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
21130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
21140 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
21150 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
21160 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
21170 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
21180 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
21190 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
211a0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
211b0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
211c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
211d0 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
211e0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
211f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
21200 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
21210 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
21220 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
21230 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
21240 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
21250 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
21260 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
21270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21280 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
21290 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
212a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
212b0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
212c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
212d0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
212e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
212f0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
21300 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
21310 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21320 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
21330 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
21340 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
21350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21360 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
21370 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
21380 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
21390 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
213a0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
213b0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
213c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a  aDb[iDb].zName :
213d0 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
213e0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
213f0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
21400 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
21410 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
21420 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
21430 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
21440 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
21450 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
21460 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
21470 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21480 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
21490 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
214a0 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
214b0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
214c0 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
214d0 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
214e0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
214f0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
21500 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
21510 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
21520 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
21530 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
21540 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
21550 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
21560 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
21570 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
21580 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
21590 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
215a0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
215b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
215c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
215d0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
215e0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
215f0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
21600 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
21610 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
21620 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
21630 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
21640 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
21650 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
21660 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
21670 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
21680 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
21690 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
216a0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
216b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
216c0 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
216d0 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
216e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
216f0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
21700 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
21710 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
21720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
21730 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
21740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21750 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
21760 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
21770 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
21780 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
21790 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
217a0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
217b0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
217c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
217d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
217e0 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
217f0 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
21800 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21820 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
21830 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
21840 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
21850 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21860 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21870 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
21880 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
21890 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
218a0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
218c0 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
218d0 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
218e0 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
218f0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
21900 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
21910 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
21920 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
21930 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21940 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21950 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21970 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
21980 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
21990 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
219a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
219b0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
219c0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
219d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
219e0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
219f0 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
21a00 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
21a10 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
21a20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
21a30 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
21a40 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
21a50 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
21a60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
21a70 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
21a80 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
21a90 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
21aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21ab0 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
21ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21ad0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
21ae0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
21af0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21b10 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
21b20 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
21b30 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
21b40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21b60 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
21b70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
21b80 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
21b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
21ba0 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
21bb0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
21bd0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
21be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21bf0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
21c00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21c10 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
21c20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
21c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
21c40 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
21c50 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
21c60 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
21c70 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
21c80 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
21c90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
21ca0 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
21cb0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
21cc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
21cd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
21ce0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
21cf0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
21d00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
21d10 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
21d20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21d30 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
21d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21d50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21d60 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
21d70 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
21d80 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
21d90 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21db0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
21dc0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
21dd0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
21de0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
21df0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21e00 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
21e10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21e30 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
21e40 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
21e50 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
21e60 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
21e90 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
21ea0 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
21eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ec0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
21ed0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
21ee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21ef0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
21f00 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
21f10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
21f30 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
21f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21f60 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
21f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21f80 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
21f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21fa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
21fb0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
21fc0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
21fd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21fe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21ff0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22000 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
22010 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
22020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22040 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22050 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
22060 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
22070 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
22080 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
22090 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
220a0 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
220b0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
220c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
220d0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
220e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
220f0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
22100 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
22110 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
22120 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
22130 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22140 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 28  /*.** Function (
22150 6f 72 20 6d 61 63 72 6f 29 20 73 65 6c 65 63 74  or macro) select
22160 45 78 70 61 6e 64 65 72 57 69 74 68 20 69 73 20  ExpanderWith is 
22170 75 73 65 64 20 61 73 20 74 68 65 20 53 45 4c 45  used as the SELE
22180 43 54 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 62  CT callback.** b
22190 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  y sqlite3SelectE
221a0 78 70 61 6e 64 28 29 2e 20 49 6e 20 62 75 69 6c  xpand(). In buil
221b0 64 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 73  ds that do not s
221c0 75 70 70 6f 72 74 20 43 54 45 73 2c 20 74 68 69  upport CTEs, thi
221d0 73 0a 2a 2a 20 69 73 20 65 71 75 69 76 61 6c 65  s.** is equivale
221e0 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
221f0 45 78 70 61 6e 64 65 72 28 29 20 66 75 6e 63 74  Expander() funct
22200 69 6f 6e 2e 20 49 6e 20 43 54 45 2d 65 6e 61 62  ion. In CTE-enab
22210 6c 65 64 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 61  led builds,.** a
22220 6e 79 20 57 49 54 48 20 63 6c 61 75 73 65 20 61  ny WITH clause a
22230 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22240 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
22250 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  ent needs to be.
22260 2a 2a 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74  ** pushed onto t
22270 68 65 20 73 74 61 63 6b 20 62 65 66 6f 72 65 20  he stack before 
22280 63 61 6c 6c 69 6e 67 20 73 65 6c 65 63 74 45 78  calling selectEx
22290 70 61 6e 64 65 72 28 29 2c 20 61 6e 64 20 70 6f  pander(), and po
222a0 70 70 65 64 0a 2a 2a 20 6f 66 66 20 61 67 61 69  pped.** off agai
222b0 6e 20 61 66 74 65 72 77 61 72 64 73 2e 20 0a 2a  n afterwards. .*
222c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
222d0 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63  _OMIT_CTE.static
222e0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
222f0 64 65 72 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  derWith(Walker *
22300 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
22310 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
22320 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22330 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 72 65  pParse;.  int re
22340 73 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  s;.  sqlite3With
22350 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e  Push(pParse, p->
22360 70 57 69 74 68 29 3b 0a 20 20 72 65 73 20 3d 20  pWith);.  res = 
22370 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 70  selectExpander(p
22380 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 20 20 69 66  Walker, p);.  if
22390 28 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20  ( p->pWith ){.  
223a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
223b0 2d 3e 70 57 69 74 68 3d 3d 70 2d 3e 70 57 69 74  ->pWith==p->pWit
223c0 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
223d0 3e 70 57 69 74 68 20 3d 20 70 2d 3e 70 57 69 74  >pWith = p->pWit
223e0 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 20  h->pOuter;.  }. 
223f0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
22400 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
22410 65 63 74 45 78 70 61 6e 64 65 72 57 69 74 68 20  ectExpanderWith 
22420 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 0a 23  selectExpander.#
22430 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  endif../*.** No-
22440 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
22450 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
22460 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
22470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22480 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
22490 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
224a0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
224b0 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
224c0 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
224d0 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
224e0 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
224f0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
22500 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22510 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
22520 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
22530 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
22540 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
22550 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
22560 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
22570 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
22580 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
22590 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
225a0 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
225b0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
225c0 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
225d0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
225e0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
225f0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
22600 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22610 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
22620 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
22630 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
22640 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
22650 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
22660 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
22670 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
22680 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
22690 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
226a0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
226b0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
226c0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
226d0 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
226e0 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
226f0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
22700 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
22710 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
22720 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
22730 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
22740 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
22750 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
22760 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
22770 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
22780 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
22790 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
227a0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
227b0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
227c0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
227d0 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
227e0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
227f0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
22800 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
22810 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
22820 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
22830 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
22840 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
22850 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
22860 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
22870 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
22880 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
22890 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
228a0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
228b0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
228c0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
228d0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
228e0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
228f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61    if( pParse->ha
22900 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
22910 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
22920 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
22930 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
22940 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  uery;.    sqlite
22950 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
22960 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
22970 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
22980 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
22990 65 72 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  erWith;.  sqlite
229a0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
229b0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
229c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
229d0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
229e0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
229f0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
22a00 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
22a10 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
22a20 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
22a30 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
22a40 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
22a50 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
22a60 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
22a70 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
22a80 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
22a90 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
22aa0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
22ab0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
22ac0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
22ad0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
22ae0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
22af0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
22b00 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
22b10 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
22b20 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
22b30 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
22b40 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
22b50 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
22b60 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
22b70 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
22b80 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
22b90 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
22ba0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
22bb0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
22bc0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
22bd0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
22be0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
22bf0 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71  nt selectAddSubq
22c00 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c  ueryTypeInfo(Wal
22c10 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
22c20 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
22c30 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  e *pParse;.  int
22c40 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
22c50 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
22c60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22c70 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74  pFrom;..  assert
22c80 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
22c90 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20  SF_Resolved );. 
22ca0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
22cb0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
22cc0 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  fo)==0 ){.    p-
22cd0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
22ce0 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20  HasTypeInfo;.   
22cf0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
22d00 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70  r->pParse;.    p
22d10 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
22d20 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  c;.    for(i=0, 
22d30 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
22d40 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
22d50 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
22d60 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  +){.      Table 
22d70 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
22d80 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41  Tab;.      if( A
22d90 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26  LWAYS(pTab!=0) &
22da0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
22db0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
22dc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22dd0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
22de0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22df0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
22e00 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
22e10 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
22e20 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
22e30 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
22e40 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
22e50 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
22e60 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
22e70 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63  .          selec
22e80 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
22e90 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
22ea0 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
22eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22ec0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
22ed0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22ee0 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  e;.}.#endif.../*
22ef0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22f00 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
22f10 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
22f20 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
22f30 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
22f40 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
22f50 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
22f60 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
22f70 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
22f80 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
22f90 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
22fa0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
22fb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
22fc0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
22fd0 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
22fe0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
22ff0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
23000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23010 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
23020 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
23030 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
23040 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
23050 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
23060 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
23070 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
23080 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
23090 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
230a0 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 62 53 65   pParse;.  w.bSe
230b0 6c 65 63 74 44 65 70 74 68 46 69 72 73 74 20 3d  lectDepthFirst =
230c0 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   1;.  sqlite3Wal
230d0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
230e0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
230f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23100 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
23110 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
23120 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
23130 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
23140 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
23150 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
23160 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
23170 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
23180 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
23190 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
231a0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
231b0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
231c0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
231d0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
231e0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
231f0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
23200 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
23210 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
23220 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
23230 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
23240 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
23250 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
23260 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
23270 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
23280 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
23290 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
232a0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
232b0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
232c0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
232d0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
232e0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
232f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
23300 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
23310 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
23320 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
23330 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
23340 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
23350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
23360 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
23370 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
23380 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
23390 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
233a0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
233b0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
233c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
233d0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
233e0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
233f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
23400 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23410 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
23420 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
23430 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
23440 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
23450 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
23460 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
23470 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
23480 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23490 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
234a0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
234b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
234c0 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
234d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
234e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
234f0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
23500 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
23510 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
23520 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
23530 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
23540 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
23550 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
23560 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
23570 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
23580 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
23590 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
235a0 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
235b0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
235c0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
235d0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
235e0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
235f0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
23600 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
23610 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
23620 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
23630 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
23640 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
23650 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
23660 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23670 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
23680 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
23690 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
236a0 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
236b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
236c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
236d0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
236e0 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
236f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
23700 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
23710 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
23720 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
23730 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
23740 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
23750 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
23760 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
23770 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
23780 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
23790 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
237a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
237b0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
237c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
237d0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
237e0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
237f0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
23800 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
23810 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
23820 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
23830 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
23840 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
23850 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
23860 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
23870 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
23880 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
23890 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
238a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
238b0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
238c0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
238d0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
238e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
238f0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
23900 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
23910 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
23920 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
23930 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
23940 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
23950 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
23960 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
23970 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
23980 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
23990 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
239a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
239b0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
239c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
239d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
239e0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
239f0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
23a00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23a10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23a20 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
23a30 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
23a40 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
23a50 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
23a60 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
23a70 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
23a80 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
23a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
23aa0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
23ab0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
23ac0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
23ad0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
23ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23af0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
23b00 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
23b10 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
23b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23b30 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
23b40 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
23b50 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
23b60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
23b70 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
23b80 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
23b90 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
23ba0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
23bb0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
23bc0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
23bd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
23be0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
23bf0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
23c00 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
23c10 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
23c20 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
23c30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
23c40 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
23c50 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
23c60 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
23c70 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
23c80 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
23c90 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
23ca0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
23cb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
23cc0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23cd0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
23ce0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
23cf0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
23d00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
23d10 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
23d20 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
23d30 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
23d40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
23d50 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
23d60 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
23d70 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
23d80 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
23d90 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
23da0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
23db0 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
23dc0 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
23dd0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
23de0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
23df0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
23e00 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
23e10 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
23e20 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
23e30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
23e40 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
23e50 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
23e60 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
23e70 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
23e80 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
23e90 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
23ea0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
23eb0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
23ec0 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
23ed0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
23ee0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
23ef0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
23f00 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
23f10 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
23f20 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
23f30 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
23f40 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
23f50 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
23f60 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
23f70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23f80 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
23f90 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23fa0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
23fb0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
23fc0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
23fd0 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
23fe0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
23ff0 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
24000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
24010 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
24020 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53  pList, regAgg, S
24030 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
24040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24050 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
24060 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
24070 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
24080 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
24090 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
240a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
240b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
240c0 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
240d0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
240e0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
240f0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
24100 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
24110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24120 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
24130 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
24140 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
24150 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
24160 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
24170 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24180 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
24190 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
241a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
241b0 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
241c0 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
241d0 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
241e0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
241f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
24200 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
24210 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
24220 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
24230 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
24240 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
24250 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
24260 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
24270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
24280 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
24290 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
242a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
242b0 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
242c0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
242d0 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
242e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
242f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24300 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
24310 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
24320 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
24330 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
24340 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
24350 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
24360 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
24370 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
243a0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
243b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
243c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
243d0 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
243e0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
243f0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
24400 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
24410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
24420 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
24430 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
24440 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
24450 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
24460 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
24470 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
24480 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
24490 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
244a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
244b0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
244c0 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
244d0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
244e0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
244f0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
24500 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
24510 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
24520 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
24530 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
24540 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
24550 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
24560 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
24570 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
24580 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
24590 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
245a0 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
245b0 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
245c0 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
245d0 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
245e0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
245f0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
24600 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
24610 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
24620 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
24630 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
24640 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
24650 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
24660 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
24670 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
24680 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
24690 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
246a0 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
246b0 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
246c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
246d0 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
246e0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
246f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
24700 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a  f, regHit);.  }.
24710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24720 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
24730 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
24740 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
24750 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
24760 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
24770 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
24780 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24790 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
247a0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
247b0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
247c0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
247d0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
247e0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
247f0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
24800 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
24810 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
24820 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
24830 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
24840 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
24850 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
24860 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
24870 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
24880 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
24890 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
248a0 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
248b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
248c0 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
248d0 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
248e0 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
248f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24900 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24910 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
24920 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24940 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
24950 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
24960 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
24970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24980 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
24990 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
249a0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
249b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
249c0 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
249d0 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
249e0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
249f0 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
24a00 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
24a10 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
24a20 20 20 20 20 70 49 64 78 20 3f 20 22 20 55 53 49      pIdx ? " USI
24a30 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
24a40 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
24a50 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
24a60 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
24a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24a80 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
24a90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
24aa0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
24ab0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
24ac0 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
24ad0 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
24ae0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
24af0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
24b00 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
24b10 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
24b20 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
24b30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24b40 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
24b50 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
24b60 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24b70 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
24b80 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
24b90 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
24ba0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
24bb0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
24bc0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
24bd0 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
24be0 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
24bf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
24c00 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
24c10 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
24c20 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
24c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c50 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
24c60 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
24c70 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
24c80 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
24c90 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
24cc0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
24cd0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
24ce0 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
24cf0 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
24d00 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
24d10 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
24d20 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
24d30 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
24d40 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
24d50 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
24d60 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
24d90 73 74 2d 3e 69 53 44 50 61 72 6d 20 74 68 65 6e  st->iSDParm then
24da0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73   abandon the res
24db0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
24dc0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
24dd0 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73  query.  This des
24de0 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73  tination implies
24df0 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a   "LIMIT 1"..**.*
24e00 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
24e10 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74        The result
24e20 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
24e30 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65  e column.  Store
24e40 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20   each.**        
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
24e60 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68   of result as th
24e70 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70  e key in table p
24e80 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 20 0a  Dest->iSDParm. .
24e90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
24ea0 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65         Apply the
24eb0 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d   affinity pDest-
24ec0 3e 61 66 66 53 64 73 74 20 62 65 66 6f 72 65 20  >affSdst before 
24ed0 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
24ef0 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f  esults.  Used to
24f00 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28   implement "IN (
24f10 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a  SELECT ...)"..**
24f20 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
24f30 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
24f40 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
24f50 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
24f60 62 6c 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble .**         
24f70 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
24f80 74 69 66 69 65 64 20 62 79 20 70 44 65 73 74 2d  tified by pDest-
24f90 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  >iSDParm..**.** 
24fa0 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
24fb0 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
24fc0 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
24fd0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
24fe0 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
24ff0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
25000 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
25010 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
25020 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53   table pDest->iS
25030 44 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  DParm..**       
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
25050 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
25060 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
25070 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
250a0 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
250b0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
250c0 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
250d0 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
250e0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
250f0 53 44 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65  SDParm and store
25100 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25110 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75          the resu
25120 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75  lt there. The cu
25130 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65  rsor is left ope
25140 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20  n after.**      
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25160 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20  eturning.  This 
25170 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c  is like SRT_Tabl
25180 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  e except that.**
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251a0 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e       this destin
251b0 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70  ation uses OP_Op
251c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63  enEphemeral to c
251d0 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  reate.**        
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
251f0 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a   table first..**
25200 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f  .**     SRT_Coro
25210 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65  utine   Generate
25220 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
25230 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  at returns a new
25240 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20   row of.**      
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25260 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65  esults each time
25270 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20   it is invoked. 
25280 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74   The entry point
25290 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
252a0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
252b0 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f  o-routine is sto
252c0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
252d0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
252e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
252f0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
25300 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
25310 6c 6c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  ll pDest->iSDPar
25320 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
25330 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25340 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
25350 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
25360 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
25370 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
25380 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69 73  ults away.  This
25390 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c 45   is used by SELE
253a0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  CT.**           
253b0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
253c0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
253d0 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20  gers whose only 
253e0 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20  purpose is.**   
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65 63    the side-effec
25410 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e  ts of functions.
25420 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
25430 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
25440 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
25450 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
25460 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
25470 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
25480 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
25490 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
254a0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
254b0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
254c0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
254d0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
254e0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
254f0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
25500 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
25510 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
25520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25530 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
25540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
25550 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
25560 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
25570 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
25580 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
25590 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
255a0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
255b0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
255c0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
255d0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
255e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
255f0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
25600 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25610 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
25620 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
25630 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
25640 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
25650 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
25660 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
25670 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
25680 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
25690 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
256a0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
256b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
256c0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
256d0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
256e0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
256f0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
25700 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
25710 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
25720 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
25730 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
25740 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
25750 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
25760 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
25770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
25780 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
25790 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
257a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
257b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
257c0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
257d0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
257e0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
257f0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
25800 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
25810 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
25820 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
25830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
25840 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
25850 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
25860 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
25870 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
25880 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
25890 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
258a0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
258b0 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
258c0 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
258d0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
258e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
258f0 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
25900 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
25910 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
25920 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
25930 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
25940 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
25950 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
25960 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
25970 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
25980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25990 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
259a0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
259b0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
259c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
259d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
259e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
259f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a00 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
25a10 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
25a20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
25a30 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
25a40 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
25a50 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
25a60 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
25a70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
25a80 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
25a90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
25aa0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
25ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
25ac0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
25ad0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
25ae0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
25af0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
25b00 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
25b10 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
25b20 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
25b30 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
25b40 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
25b50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
25b60 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
25b70 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
25b80 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
25b90 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
25ba0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
25bb0 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
25bc0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
25bd0 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49  scard);.    /* I
25be0 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
25bf0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
25c00 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
25c10 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
25c20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
25c30 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
25c40 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
25c50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
25c60 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
25c70 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
25c80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
25c90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
25ca0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
25cb0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
25cc0 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
25cd0 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20   0);.  pOrderBy 
25ce0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
25cf0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
25d00 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
25d10 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
25d20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
25d30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25d40 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
25d50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
25d60 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
25d70 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
25d80 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72  ate)!=0;.  asser
25d90 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
25da0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
25db0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
25dc0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
25dd0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
25de0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
25df0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
25e00 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
25e10 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
25e20 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
25e30 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
25e40 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
25e50 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
25e60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
25e70 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
25e80 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
25e90 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
25ea0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
25eb0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
25ec0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
25ed0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
25ee0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
25ef0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
25f00 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
25f10 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
25f20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
25f30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
25f40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
25f50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
25f60 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
25f70 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
25f80 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
25f90 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
25fa0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
25fb0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
25fc0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
25fd0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
25fe0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
25ff0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
26000 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
26010 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
26020 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
26030 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
26040 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
26050 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
26060 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
26070 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
26080 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
26090 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
260a0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
260b0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
260c0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
260d0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
260e0 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
260f0 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
26100 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
26110 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
26120 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
26130 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
26140 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
26150 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
26160 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
26170 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
26180 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
26190 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
261a0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
261b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
261c0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
261d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
261e0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
261f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
26200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26210 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
26220 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
26230 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
26240 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
26250 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26260 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
26270 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
26280 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
26290 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
262a0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
262b0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
262c0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
262d0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
262e0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
262f0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
26300 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
26310 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
26320 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
26330 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
26340 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
26350 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
26360 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
26370 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
26380 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
26390 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
263a0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
263b0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
263c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
263d0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
263e0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
263f0 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
26400 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
26410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26420 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
26430 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
26440 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
26450 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
26460 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
26470 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
26480 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
26490 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
264a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
264b0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
264c0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
264d0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
264e0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
264f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26500 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
26510 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
26520 6e 53 72 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73  nSrc==1 && (p->s
26530 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 61 74  elFlags & SF_Mat
26540 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20  erialize)==0.   
26550 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
26560 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
26570 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
26580 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
26590 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
265a0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
265b0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
265c0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
265d0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
265e0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
265f0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
26600 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
26610 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  op;.      int ad
26620 64 72 45 6f 66 3b 0a 20 20 20 20 20 20 70 49 74  drEof;.      pIt
26630 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
26640 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26650 20 20 20 20 20 20 61 64 64 72 45 6f 66 20 3d 20        addrEof = 
26660 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26670 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20        /* Before 
26680 63 6f 64 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f  coding the OP_Go
26690 74 6f 20 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68  to to jump to th
266a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
266b0 61 69 6e 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20  ain routine,.   
266c0 20 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61     ** ensure tha
266d0 74 20 74 68 65 20 6a 75 6d 70 20 74 6f 20 74 68  t the jump to th
266e0 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d 61 20  e verify-schema 
266f0 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65  routine has alre
26700 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ady.      ** bee
26710 6e 20 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69  n coded. Otherwi
26720 73 65 2c 20 74 68 65 20 76 65 72 69 66 79 2d 73  se, the verify-s
26730 63 68 65 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65  chema would like
26740 6c 79 20 62 65 20 63 6f 64 65 64 20 61 73 20 0a  ly be coded as .
26750 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
26760 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e   the co-routine.
26770 20 49 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75   If the main rou
26780 74 69 6e 65 20 74 68 65 6e 20 61 63 63 65 73 73  tine then access
26790 65 64 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ed the .      **
267a0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
267b0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
267c0 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65  -routine for the
267d0 20 66 69 72 73 74 20 74 69 6d 65 20 28 66 6f 72   first time (for
267e0 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70   .      ** examp
267f0 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  le to initialize
26800 20 61 20 4c 49 4d 49 54 20 72 65 67 69 73 74 65   a LIMIT registe
26810 72 20 66 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c  r from a sub-sel
26820 65 63 74 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a  ect), it would .
26830 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e        ** be doin
26840 67 20 73 6f 20 77 69 74 68 6f 75 74 20 68 61 76  g so without hav
26850 69 6e 67 20 76 65 72 69 66 69 65 64 20 74 68 65  ing verified the
26860 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
26870 61 6e 64 20 6f 62 74 61 69 6e 65 64 20 0a 20 20  and obtained .  
26880 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69      ** the requi
26890 72 65 64 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65  red db locks. Se
268a0 65 20 74 69 63 6b 65 74 20 64 36 62 33 36 62 65  e ticket d6b36be
268b0 33 38 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  38.  */.      sq
268c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
268d0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
268e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
268f0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
26900 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61 64  _Goto);.      ad
26910 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
26920 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
26930 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49 74 65  OpenPseudo, pIte
26940 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
26950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26960 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
26970 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26980 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66  (v, "coroutine f
26990 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  or %s", pItem->p
269a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
269b0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
269c0 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
269d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
269e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
269f0 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64 64 72  Integer, 0, addr
26a00 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Eof);.      sqli
26a10 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
26a20 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  v, 1);.      sql
26a30 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
26a40 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
26a50 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
26a60 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
26a70 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
26a80 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
26a90 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
26aa0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
26ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
26ac0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
26ad0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
26ae0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
26af0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
26b00 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  ed)pSub->nSelect
26b10 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
26b20 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
26b30 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
26b40 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
26b50 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69   addrTop, dest.i
26b60 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
26b70 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
26b80 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73  (v, addrTop, des
26b90 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  t.nSdst);.      
26ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26bb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
26bc0 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20   1, addrEof);.  
26bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26be0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
26bf0 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  d, pItem->regRet
26c00 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
26c10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
26c20 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
26c30 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
26c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
26c50 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
26c60 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
26c70 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
26c80 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
26c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
26ca0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
26cb0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
26cc0 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
26cd0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
26ce0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
26cf0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
26d00 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
26d10 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
26d20 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
26d30 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
26d40 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
26d50 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
26d60 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
26d70 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
26d80 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
26d90 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
26da0 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
26db0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
26dc0 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
26dd0 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
26de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
26df0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61  retAddr;.      a
26e00 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
26e10 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
26e20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
26e30 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
26e40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
26e50 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
26e60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26e70 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
26e80 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
26e90 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
26ea0 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
26eb0 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65  dr+1;.      Vdbe
26ec0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
26ed0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22  "materialize %s"
26ee0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
26ef0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66  Name));.      if
26f00 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
26f10 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
26f20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
26f30 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
26f40 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
26f50 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
26f60 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
26f70 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
26f80 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
26f90 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
26fa0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
26fb0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
26fc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
26fd0 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
26fe0 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
26ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27000 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
27010 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
27020 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
27030 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
27040 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
27050 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
27060 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
27070 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
27080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
27090 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
270a0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
270b0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
270c0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
270d0 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  ed)pSub->nSelect
270e0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
270f0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
27100 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
27110 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
27120 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
27130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
27140 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
27150 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
27160 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27170 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
27180 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
27190 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
271a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
271b0 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
271c0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
271d0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
271e0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
271f0 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61   }.    if( /*pPa
27200 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64  rse->nErr ||*/ d
27210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27220 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
27230 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
27240 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
27250 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
27260 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
27270 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
27280 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
27290 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
272a0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
272b0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
272c0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
272d0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
272e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
272f0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
27300 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
27310 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
27320 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
27330 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
27340 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
27350 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
27360 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
27370 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27380 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
27390 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
273a0 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
273b0 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
273c0 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
273d0 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
273e0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
273f0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
27400 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
27410 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
27420 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20  Loop, *pRight = 
27430 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  0;.      int cnt
27440 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
27450 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  mxSelect;.      
27460 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
27470 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
27480 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b  >pPrior, cnt++){
27490 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
274a0 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
274b0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
274c0 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
274d0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
274e0 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  pLoop;.      }. 
274f0 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20       mxSelect = 
27500 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
27510 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
27520 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20  _SELECT];.      
27530 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20  if( mxSelect && 
27540 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a  cnt>mxSelect ){.
27550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27560 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27570 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
27580 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
27590 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CT");.        go
275a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
275b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
275c0 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
275d0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
275e0 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
275f0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
27600 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
27610 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
27620 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
27630 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
27640 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
27650 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
27660 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
27670 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
27680 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  .  ** identical,
27690 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68   then disable th
276a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
276b0 65 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55  e since the GROU
276c0 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63  P BY.  ** will c
276d0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
276e0 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65   come out in the
276f0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
27700 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e   This is.  ** an
27710 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
27720 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
27730 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
27740 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a   regardless..  *
27750 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
27760 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
27770 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
27780 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
27790 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c  R.  ** to disabl
277a0 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
277b0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
277c0 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20  purposes..  */. 
277d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
277e0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70  ListCompare(p->p
277f0 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42  GroupBy, pOrderB
27800 79 2c 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20  y, -1)==0.      
27810 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
27820 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
27830 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
27840 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  r) ){.    pOrder
27850 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
27860 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
27870 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
27880 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
27890 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
278a0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
278b0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
278c0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
278d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
278e0 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
278f0 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
27900 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
27910 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
27920 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
27930 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
27940 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
27950 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
27960 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
27970 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
27980 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
27990 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
279a0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
279b0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
279c0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
279d0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
279e0 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
279f0 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
27a00 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
27a10 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
27a20 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
27a30 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
27a40 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
27a50 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
27a60 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
27a70 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
27a80 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
27a90 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
27aa0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
27ab0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
27ac0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
27ad0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
27ae0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
27af0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
27b00 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
27b10 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
27b20 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
27b30 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
27b40 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70  e(pOrderBy, p->p
27b50 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
27b60 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
27b70 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
27b80 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75  ct;.    p->pGrou
27b90 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
27ba0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
27bb0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
27bc0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
27bd0 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64  roupBy;.    pOrd
27be0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  erBy = 0;.    /*
27bf0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
27c00 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
27c10 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
27c20 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
27c30 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
27c40 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
27c50 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
27c60 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
27c70 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
27c80 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
27c90 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
27ca0 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
27cb0 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
27cc0 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
27cd0 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
27ce0 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d  ct.isTnct );.  }
27cf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
27d00 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
27d10 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
27d20 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
27d30 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
27d40 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
27d50 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
27d60 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
27d70 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
27d80 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
27d90 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
27da0 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
27db0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
27dc0 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
27dd0 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
27de0 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
27df0 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
27e00 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
27e10 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
27e20 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
27e30 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
27e40 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
27e50 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
27e60 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
27e70 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
27e80 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
27e90 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
27ea0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
27eb0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27ec0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
27ed0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
27ee0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
27ef0 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
27f00 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
27f10 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
27f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27f30 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
27f40 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
27f70 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
27f80 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
27fb0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
27fc0 59 49 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b  YINFO);.  }else{
27fd0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
27fe0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
27ff0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
28000 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
28010 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
28020 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
28030 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
28040 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
28050 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
28060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28070 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
28080 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
28090 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
280a0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
280b0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
280c0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
280d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
280e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
280f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52  nSelectRow = LAR
28100 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f  GEST_INT64;.  co
28110 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
28120 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
28130 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
28140 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72  Limit==0 && addr
28150 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
28160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
28170 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  etOp(v, addrSort
28180 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d  Index)->opcode =
28190 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a   OP_SorterOpen;.
281a0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
281b0 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b  |= SF_UseSorter;
281c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
281d0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
281e0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
281f0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
28200 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
28210 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
28220 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
28230 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
28240 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
28250 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
28260 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
28270 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
28280 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
282b0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
282c0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
282f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
28300 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
28310 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  st),.           
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
28340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28350 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
28360 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
28370 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
28380 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
28390 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
283a0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
283b0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
283c0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
283d0 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
283e0 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
283f0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
28400 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
28410 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
28420 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
28430 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
28440 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
28450 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
28460 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
28470 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
28480 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
28490 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
284a0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
284b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
284c0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
284d0 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c  Where, pOrderBy,
284e0 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20   p->pEList,.    
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
28510 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69  Flags, 0);.    i
28520 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
28530 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
28540 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
28550 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
28560 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
28570 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
28580 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
28590 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
285a0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
285b0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
285c0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
285d0 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
285e0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
285f0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
28600 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
28610 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
28620 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
28630 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
28640 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
28650 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
28660 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
28670 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
28680 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
28690 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
286a0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
286b0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
286c0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
286d0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
286e0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
286f0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
28700 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
28710 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
28720 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
28730 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
28740 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
28750 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
28760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28770 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
28780 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b   addrSortIndex);
28790 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
287a0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
287b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
287c0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
287d0 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
287e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
287f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
28800 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
28810 72 42 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  rBy, &sDistinct,
28820 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
28830 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28840 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
28850 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
28880 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
28890 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
288a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
288b0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
288c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
288d0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
288e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
288f0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
28900 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
28910 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
28920 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
28930 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
28940 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
28950 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
28960 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
28970 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
28980 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
28990 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
289a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
289b0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
289c0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
289d0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
289e0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
289f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
28a00 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
28a10 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
28a20 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
28a30 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
28a40 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
28a50 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
28a60 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
28a70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
28a80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
28a90 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
28aa0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
28ab0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
28ae0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
28af0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
28b00 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
28b10 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
28b20 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
28b30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
28b40 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
28b50 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
28b60 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
28b70 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
28b80 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
28b90 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
28ba0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
28bb0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
28bc0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
28bd0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
28be0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
28bf0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
28c00 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
28c10 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
28c20 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
28c30 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
28c40 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
28c50 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
28c60 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
28c70 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
28c80 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
28c90 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
28ca0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
28cb0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
28cc0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
28cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
28ce0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
28cf0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
28d00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
28d10 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
28d20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
28d30 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
28d40 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
28d50 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
28d60 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
28d70 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
28d80 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
28d90 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
28da0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
28db0 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
28dc0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
28dd0 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
28de0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
28df0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
28e00 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
28e10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28e20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30  p->nSelectRow>10
28e30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
28e40 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c  w = 100;.    }el
28e50 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
28e60 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  lectRow = 1;.   
28e70 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.. .    /* Cre
28e80 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
28e90 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
28ea0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
28eb0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
28ec0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
28ed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
28ee0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
28ef0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
28f00 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
28f10 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
28f20 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
28f30 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
28f40 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
28f50 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
28f60 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
28f70 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
28f80 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
28f90 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
28fa0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
28fb0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
28fc0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
28fd0 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
28fe0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
28ff0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
29000 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
29010 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
29020 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
29030 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
29040 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
29050 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
29060 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
29070 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
29080 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
29090 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
290a0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
290b0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
290c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
290d0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
290e0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
290f0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
29100 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
29110 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
29120 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
29130 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
29140 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
29150 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
29160 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
29170 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
29180 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
29190 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
291a0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
291b0 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
291c0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
291d0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
291e0 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
291f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29200 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
29210 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
29220 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
29230 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
29240 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
29250 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
29260 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
29270 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
29280 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
29290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
292a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
292b0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
292c0 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
292d0 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
292e0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
292f0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
29300 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
29310 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
29320 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
29330 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
29340 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
29350 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
29360 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
29370 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
29380 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
29390 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
293a0 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
293b0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
293c0 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
293d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
293e0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
293f0 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
29400 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
29410 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
29420 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
29430 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
29440 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
29450 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
29460 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
29470 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
29480 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
29490 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
294a0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
294b0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
294c0 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
294d0 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
294e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
294f0 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
29500 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
29510 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
29520 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
29530 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
29540 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
29550 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
29560 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
29570 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
29580 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
29590 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
295a0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
295b0 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
295c0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
295d0 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
295e0 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
295f0 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
29600 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
29610 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
29620 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
29630 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
29640 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
29650 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
29660 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
29670 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
29680 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
29690 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
296a0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
296b0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
296c0 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
296d0 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
296e0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
296f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
29700 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
29710 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
29720 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
29730 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
29740 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
29750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
29760 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
29770 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
29780 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
29790 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
297a0 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
297b0 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
297c0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
297d0 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
297e0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
297f0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
29800 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
29810 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
29820 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
29830 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
29840 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
29850 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
29860 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29870 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
29880 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
29890 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
298a0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
298b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
298c0 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
298d0 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
298e0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
298f0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
29900 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29910 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
29920 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
29930 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
29940 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
29950 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
29960 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
29970 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
29980 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
29990 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
299a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
299b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
299c0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
299d0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
299e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
299f0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
29a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29a10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
29a20 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
29a30 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
29a40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
29a50 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
29a60 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
29a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29a80 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
29a90 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
29aa0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
29ab0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
29ac0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
29ad0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
29ae0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
29af0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
29b00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
29b10 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
29b20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
29b30 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
29b40 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
29b50 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
29b60 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
29b70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
29b80 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
29b90 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
29ba0 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
29bb0 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
29bc0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
29bd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29be0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
29bf0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
29c00 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
29c10 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
29c20 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
29c30 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
29c40 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
29c50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
29c80 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  Y, 0);.      if(
29c90 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
29ca0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
29cb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
29cc0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
29cd0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
29ce0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
29cf0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
29d00 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
29d10 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
29d20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
29d30 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
29d40 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
29d50 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
29d60 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
29d70 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
29d80 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
29d90 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
29da0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
29db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
29dc0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
29dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29de0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
29df0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
29e00 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
29e10 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
29e20 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
29e30 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
29e40 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
29e50 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
29e60 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
29e70 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
29e80 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
29e90 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
29ea0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
29eb0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
29ec0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
29ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
29ee0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
29ef0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
29f00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
29f10 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
29f20 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
29f30 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
29f40 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
29f50 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
29f60 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
29f70 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
29f80 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
29fb0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
29fc0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
29fd0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
29fe0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
29ff0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2a000 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
2a010 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
2a020 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
2a030 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2a040 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2a050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2a060 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
2a070 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
2a080 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2a090 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
2a0a0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2a0b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2a0d0 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
2a0e0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2a0f0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2a100 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2a110 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a120 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a130 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2a140 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2a150 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
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 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
2a190 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
2a1a0 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
2a1b0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2a1c0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
2a1d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2a1e0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2a1f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2a200 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2a210 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2a220 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2a230 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2a240 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2a250 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2a260 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2a270 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2a280 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2a290 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2a2a0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2a2b0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a2e0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2a2f0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2a300 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2a310 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2a320 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2a330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a340 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2a350 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2a360 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a370 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2a380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a390 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2a3a0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2a3b0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2a3c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a3d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2a3e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2a3f0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2a400 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2a410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a420 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2a430 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2a440 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2a450 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2a460 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2a470 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2a480 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2a490 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2a4a0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2a4b0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2a4c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a4d0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2a4e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2a4f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2a500 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2a510 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2a520 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2a530 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2a540 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2a550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a560 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2a570 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2a580 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2a590 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2a5a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2a5b0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2a5c0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2a5d0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2a5e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2a5f0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2a600 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
2a610 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
2a620 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
2a630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a640 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2a650 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
2a660 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
2a670 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2a680 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
2a690 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
2a6a0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
2a6b0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
2a6c0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
2a6d0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
2a6e0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
2a6f0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
2a700 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2a710 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
2a720 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
2a730 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
2a740 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
2a750 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
2a760 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
2a770 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
2a780 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
2a790 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2a7a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2a7b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a7c0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2a7d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
2a7e0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2a7f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a800 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a810 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
2a820 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2a830 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  , sortOut);.    
2a840 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2a850 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
2a860 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2a870 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2a880 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
2a890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a8a0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2a8b0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
2a8c0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2a8d0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c    if( j==0 ) sql
2a8e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2a8f0 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
2a900 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
2a910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a920 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
2a930 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
2a940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a950 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
2a960 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
2a970 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2a980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a9a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
2a9b0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
2a9c0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2a9d0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2a9f0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
2aa00 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
2aa10 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2aa20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
2aa30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2aa40 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2aa50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2aa60 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
2aa70 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
2aa80 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2aa90 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
2aaa0 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
2aab0 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
2aac0 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
2aad0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
2aae0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
2aaf0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
2ab00 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
2ab10 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
2ab20 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
2ab30 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
2ab40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2ab50 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
2ab60 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
2ab70 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
2ab80 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
2ab90 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
2aba0 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
2abb0 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
2abc0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2abd0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
2abe0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2abf0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2ac00 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
2ac10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
2ac20 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
2ac30 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
2ac40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ac50 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
2ac60 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
2ac70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
2ac80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ac90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2aca0 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2acb0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2acc0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2acd0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2ace0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
2acf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2ad10 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
2ad20 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
2ad30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ad40 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2ad50 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2ad60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ad70 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2ad80 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2ad90 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2ada0 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2adb0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2adc0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2add0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2ade0 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2adf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2ae00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2ae10 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2ae20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2ae30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ae40 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2ae50 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2ae60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2ae70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ae80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2ae90 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2aea0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2aeb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2aec0 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2aed0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2aee0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2aef0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2af00 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2af10 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2af20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2af30 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2af40 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2af50 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2af60 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2af70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2af80 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2af90 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2afa0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2afb0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2afc0 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2afd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2afe0 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2aff0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2b000 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2b010 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b020 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2b030 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2b040 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2b050 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2b060 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2b070 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2b080 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2b090 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2b0a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2b0b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b0c0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
2b0d0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2b0e0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2b0f0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2b100 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2b110 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2b120 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2b130 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2b140 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2b150 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2b160 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2b170 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2b180 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2b190 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2b1a0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2b1b0 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2b1c0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2b1d0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2b1e0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2b1f0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2b200 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2b210 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2b220 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2b230 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2b240 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2b250 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2b260 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2b270 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2b280 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2b290 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2b2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b2b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2b2c0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
2b2d0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2b2e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
2b2f0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
2b300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b310 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2b320 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
2b330 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
2b340 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2b350 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
2b360 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
2b370 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2b380 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2b390 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2b3a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b3b0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
2b3c0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
2b3d0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
2b3e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2b3f0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
2b400 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
2b410 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
2b420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2b430 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2b440 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2b450 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2b460 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2b470 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2b480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2b490 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
2b4a0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
2b4b0 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
2b4c0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2b4d0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2b4e0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2b4f0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
2b500 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2b520 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2b530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b540 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
2b550 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
2b560 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
2b570 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b580 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2b590 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2b5a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b5b0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
2b5c0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
2b5d0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
2b5e0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2b5f0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2b600 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
2b610 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
2b620 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2b630 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2b640 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
2b650 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
2b660 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2b670 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2b680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b690 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2b6a0 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
2b6b0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
2b6c0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
2b6d0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
2b6e0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
2b6f0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
2b700 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
2b710 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
2b720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b730 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
2b740 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2b750 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
2b760 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
2b770 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
2b780 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2b790 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
2b7a0 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
2b7b0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
2b7c0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
2b7d0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
2b7e0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2b7f0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
2b800 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2b810 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
2b820 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
2b830 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
2b840 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
2b850 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2b860 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
2b870 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
2b880 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
2b890 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
2b8a0 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
2b8b0 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
2b8c0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
2b8d0 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
2b8e0 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
2b8f0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
2b900 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
2b910 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
2b920 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2b930 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2b940 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
2b950 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
2b960 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
2b970 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
2b980 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
2b990 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
2b9a0 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
2b9b0 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
2b9c0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
2b9d0 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
2b9e0 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
2b9f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2ba00 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
2ba10 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2ba20 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
2ba30 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
2ba40 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
2ba50 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2ba60 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
2ba70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ba80 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
2ba90 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
2baa0 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2bab0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bad0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2bae0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2baf0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2bb00 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
2bb10 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
2bb20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
2bb30 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
2bb40 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb60 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2bb70 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
2bb80 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
2bb90 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bbb0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
2bbc0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
2bbd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2bbe0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2bbf0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2bc00 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2bc10 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2bc20 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2bc30 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2bc40 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
2bc50 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
2bc60 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
2bc70 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
2bc80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2bc90 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
2bca0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
2bcb0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
2bcc0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
2bcd0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2bce0 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
2bcf0 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
2bd00 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
2bd10 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
2bd20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2bd30 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
2bd40 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
2bd50 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
2bd60 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
2bd70 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
2bd80 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
2bd90 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
2bda0 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
2bdb0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2bdc0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
2bdd0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
2bde0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2bdf0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
2be00 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2be10 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2be20 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
2be30 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
2be40 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2be50 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
2be60 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
2be70 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
2be80 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
2be90 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
2bea0 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
2beb0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
2bec0 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
2bed0 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
2bee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bef0 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
2bf00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2bf20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
2bf30 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
2bf40 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
2bf50 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
2bf60 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
2bf70 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
2bf80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2bf90 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
2bfa0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
2bfb0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
2bfc0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
2bfd0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
2bfe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bff0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
2c000 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
2c010 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
2c020 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
2c030 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2c040 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2c050 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
2c060 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
2c070 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2c080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2c090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c0a0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
2c0b0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
2c0c0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
2c0d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c0e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2c0f0 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
2c100 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
2c110 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
2c120 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
2c130 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2c140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2c150 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
2c160 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
2c170 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
2c180 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
2c190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
2c1a0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2c1b0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2c1c0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
2c1d0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
2c1e0 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
2c1f0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
2c200 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
2c210 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
2c220 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
2c230 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
2c240 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
2c250 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
2c260 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
2c270 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
2c280 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
2c290 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
2c2a0 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
2c2b0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
2c2c0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
2c2d0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
2c2e0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
2c2f0 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
2c300 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
2c310 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
2c320 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
2c330 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
2c340 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
2c350 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2c360 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
2c370 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2c380 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
2c390 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
2c3a0 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
2c3b0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
2c3c0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
2c3d0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
2c3e0 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
2c3f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
2c400 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
2c410 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
2c420 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2c430 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
2c440 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
2c450 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
2c460 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
2c470 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
2c480 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2c490 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
2c4a0 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
2c4b0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
2c4c0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
2c4d0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
2c4e0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
2c4f0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
2c500 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
2c510 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
2c520 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c530 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
2c540 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
2c550 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
2c560 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
2c570 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
2c580 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
2c590 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
2c5a0 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
2c5b0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
2c5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c5d0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
2c5e0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
2c5f0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
2c600 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
2c610 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
2c620 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
2c630 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
2c640 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
2c650 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c660 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
2c670 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
2c680 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
2c690 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
2c6a0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2c6b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
2c6c0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
2c6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
2c6e0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
2c6f0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
2c700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2c710 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
2c720 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
2c730 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
2c740 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2c750 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
2c760 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
2c770 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
2c780 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
2c790 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2c7a0 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
2c7b0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2c7c0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
2c7d0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
2c7e0 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
2c7f0 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
2c800 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2c810 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
2c820 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2c830 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
2c840 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
2c850 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
2c860 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
2c870 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
2c880 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
2c890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c8a0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
2c8b0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
2c8c0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2c8d0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
2c8e0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
2c8f0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
2c900 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
2c910 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
2c920 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2c930 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
2c940 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
2c950 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
2c960 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
2c970 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2c980 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2c990 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2c9a0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2c9b0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2c9c0 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2c9d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2c9e0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2c9f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ca00 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2ca10 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2ca20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2ca30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ca40 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2ca50 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2ca60 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2ca70 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2ca80 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2ca90 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2caa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2cab0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2cac0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
2cad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cae0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2caf0 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65   0, sqlite3Where
2cb00 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2cb10 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  o));.          V
2cb20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2cb30 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
2cb60 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
2cb70 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
2cb80 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2cb90 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2cba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
2cbb0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2cbc0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2cbd0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
2cbe0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
2cbf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2cc00 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2cc10 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2cc20 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
2cc30 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2cc40 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2cc50 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2cc60 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ist, 0, 0, 0, 0,
2cc70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2cc80 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
2cc90 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
2cca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2ccb0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2ccc0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
2ccd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2cce0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2ccf0 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
2cd00 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
2cd10 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
2cd20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
2cd30 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
2cd40 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2cd50 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
2cd60 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2cd70 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
2cd80 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2cd90 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2cda0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
2cdb0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
2cdc0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
2cdd0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
2cde0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
2cdf0 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
2ce00 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
2ce10 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2ce20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52  able(pParse, "OR
2ce30 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
2ce40 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
2ce50 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
2ce60 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
2ce70 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
2ce80 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
2ce90 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
2cea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2ceb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
2cec0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
2ced0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
2cee0 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
2cef0 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
2cf00 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
2cf10 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
2cf20 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
2cf30 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
2cf40 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
2cf50 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
2cf60 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
2cf70 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
2cf80 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
2cf90 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
2cfa0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
2cfb0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2cfc0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2cfd0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2cfe0 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
2cff0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
2d000 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
2d010 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
2d020 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
2d030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2d040 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
2d050 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2d060 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2d070 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2d080 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2d090 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
2d0a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2d0b0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
2d0c0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
2d0d0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
2d0e0 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
2d0f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
2d100 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2d110 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
2d120 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
2d130 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2d140 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
2d150 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
2d160 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2d170 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
2d180 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2d190 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2d1a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d1b0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45  rintf(pVdbe, "SE
2d1c0 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70  LECT ");.  if( p
2d1d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2d1e0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2d1f0 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69  regate) ){.    i
2d200 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2d210 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2d220 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d230 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2d240 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a  , "DISTINCT ");.
2d250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2d260 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2d270 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
2d280 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d290 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61  Printf(pVdbe, "a
2d2a0 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20  gg_flag ");.    
2d2b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2d2c0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2d2d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d2e0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2d2f0 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c     ");.  }.  sql
2d300 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2d310 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45  ist(pVdbe, p->pE
2d320 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2d330 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2d340 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
2d350 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
2d360 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2d370 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d380 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2d390 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c  FROM ");.    sql
2d3a0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
2d3b0 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28  pVdbe);.    for(
2d3c0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
2d3d0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2d3e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2d3f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
2d400 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
2d410 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2d420 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d430 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49   "{%d,*} = ", pI
2d440 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2d450 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2d460 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2d470 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d480 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  nSelect(pVdbe, p
2d490 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
2d4a0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
2d4b0 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
2d4c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2d4d0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d4e0 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22   " (tabname=%s)"
2d4f0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2d500 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
2d510 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2d520 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
2d530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d540 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2d550 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  dbe, "%s", pItem
2d560 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2d570 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2d580 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2d590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2d5a0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d5b0 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74   " (AS %s)", pIt
2d5c0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
2d5d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2d5e0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
2d5f0 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
2d600 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2d610 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2d620 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
2d630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2d640 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2d650 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dbe);.    }.    
2d660 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
2d670 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  p(pVdbe);.  }.  
2d680 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
2d690 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2d6a0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d6b0 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20   "WHERE ");.    
2d6c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2d6d0 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68  pr(pVdbe, p->pWh
2d6e0 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
2d6f0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2d700 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2d710 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2d720 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d730 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f  intf(pVdbe, "GRO
2d740 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  UPBY ");.    sql
2d750 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2d760 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47  ist(pVdbe, p->pG
2d770 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
2d780 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2d790 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2d7a0 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
2d7b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d7c0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48  Printf(pVdbe, "H
2d7d0 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71  AVING ");.    sq
2d7e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2d7f0 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69  (pVdbe, p->pHavi
2d800 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
2d810 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2d820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2d830 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
2d840 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2d850 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45  ntf(pVdbe, "ORDE
2d860 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  RBY ");.    sqli
2d870 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2d880 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72  st(pVdbe, p->pOr
2d890 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
2d8a0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2d8b0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2d8c0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
2d8d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d8e0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d  intf(pVdbe, "LIM
2d8f0 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  IT ");.    sqlit
2d900 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2d910 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  dbe, p->pLimit);
2d920 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2d930 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2d940 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
2d950 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2d960 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2d970 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29  Vdbe, "OFFSET ")
2d980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2d990 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2d9a0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->pOffset);.   
2d9b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2d9c0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a  L(pVdbe);.  }.}.
2d9d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
2d9e0 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a  ainSelect(Vdbe *
2d9f0 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
2da00 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ){.  if( p==0 ){
2da10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2da20 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2da30 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22   "(null-select)"
2da40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2da50 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
2da60 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Prior ){.    p->
2da70 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
2da80 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  p;.    p = p->pP
2da90 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rior;.  }.  sqli
2daa0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
2dab0 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
2dac0 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
2dad0 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
2dae0 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
2daf0 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
2db00 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2db10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2db20 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2db30 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2db40 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
2db50 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
2db60 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
2db70 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2db80 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
2db90 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2dba0 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
2dbb0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
2dbc0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
2dbd0 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
2dbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2dc30 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2dc40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
2dc50 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.