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

Artifact 0b6011a51496c916914f6fba11c3a6a0042a0439:


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 69 6e 74 20  his VM */.  int 
3d50: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
3d60: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
3d70: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
3d80: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
3d90: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3da0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3dc0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3dd0: 69 4f 66 66 73 65 74 3e 30 20 26 26 20 69 43 6f  iOffset>0 && iCo
3de0: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3df0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3e10: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3e20: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3e30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3e50: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b  IfNeg, iOffset);
3e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3e70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3e80: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3e90: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3ea0: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3eb0: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3ed0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3ef0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3f00: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3f10: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3f20: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3f30: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3f40: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3f50: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3f60: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3f70: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3f80: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3f90: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3fa0: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3fb0: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3fc0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3fd0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3fe0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ff0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
4000: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
4010: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
4020: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
4030: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
4040: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
4050: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
4060: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4070: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
4080: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
40a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
40b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
40c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
40d0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
40e0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
40f0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
4100: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
4110: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4120: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4130: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4140: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4160: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4170: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4180: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4190: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
41a0: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
41b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
41c0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
41d0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
41e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
41f0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
4200: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
4210: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4220: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4240: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4250: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4270: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4280: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4290: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
42a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
42b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
42d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
42e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
42f0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
4300: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
4310: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
4320: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
4330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
4340: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
4350: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
4360: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
4370: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
4380: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
4390: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
43a0: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
43b0: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
43c0: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
43d0: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
43e0: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
43f0: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
4400: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
4410: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
4420: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
4430: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
4440: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4450: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
4460: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
4470: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
4480: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4490: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
44a0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
44b0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
44c0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
44d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
44e0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
44f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
4500: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
4510: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4520: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
4530: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4540: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4550: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4560: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4570: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4580: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4590: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
45a0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
45b0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
45c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
45d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
45e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
45f0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
4600: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
4610: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
4620: 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20  owing object is 
4630: 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69  used to record i
4640: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4650: 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65  .** how to proce
4660: 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ss the DISTINCT 
4670: 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70  keyword, to simp
4680: 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61  lify passing tha
4690: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  t information.**
46a0: 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74   into the select
46b0: 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74  InnerLoop() rout
46c0: 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ine..*/.typedef 
46d0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
46e0: 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a  tx DistinctCtx;.
46f0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
4700: 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74  tx {.  u8 isTnct
4710: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
4720: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4730: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4740: 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54  t */.  u8 eTnctT
4750: 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ype;   /* One of
4760: 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49   the WHERE_DISTI
4770: 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20  NCT_* operators 
4780: 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74  */.  int tabTnct
4790: 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61  ;    /* Ephemera
47a0: 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  l table used for
47b0: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
47c0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64  sing */.  int ad
47d0: 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64  drTnct;   /* Add
47e0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
47f0: 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20  phemeral opcode 
4800: 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d  for tabTnct */.}
4810: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4820: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
4830: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
4840: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
4850: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
4860: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
4870: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
4880: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
4890: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
48a0: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
48b0: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
48c0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
48d0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
48e0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
48f0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
4900: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
4910: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
4920: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
4930: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
4940: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
4950: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
4960: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
4970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4980: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
49b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
49c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
49d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
49e0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
49f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4a00: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4a10: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
4a20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4a30: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
4a40: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
4a50: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
4a60: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4a70: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4a80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4a90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4aa0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4ab0: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4ac0: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 44   this key */.  D
4ad0: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
4ae0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
4af0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
4b00: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
4b10: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
4b20: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4b30: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4b40: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4b50: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4b60: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4b70: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4b80: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4b90: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4ba0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4bb0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4bc0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4bd0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4be0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4bf0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4c00: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4c10: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4c20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4c30: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4c40: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4c60: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4c70: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4c80: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4c90: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4ca0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4cb0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4cc0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4cd0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4ce0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
4cf0: 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20  DParm; /* First 
4d00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4d10: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4d20: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4d50: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4d60: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
4d70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4d80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4d90: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4da0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4db0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4dc0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4dd0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4de0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4df0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e00: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
4e10: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
4e20: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
4e30: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
4e40: 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f    */.  nResultCo
4e50: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4e60: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  r;.  if( pDest->
4e70: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
4e80: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
4e90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4ea0: 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
4eb0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ec0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4ed0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ee0: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4ef0: 72 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  rt( pDest->nSdst
4f00: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4f10: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4f20: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
4f30: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
4f40: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4f50: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
4f60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4f70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4f80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4f90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4fa0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
4fb0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
4fc0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
4fd0: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
4fe0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
4ff0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
5000: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
5010: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
5020: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
5030: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
5040: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
5050: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
5060: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
5070: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5090: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
50a0: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
50b0: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  (eDest==SRT_Outp
50e0: 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f  ut)?SQLITE_ECEL_
50f0: 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DUP:0);.  }..  /
5100: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
5110: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
5120: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
5130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
5140: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
5150: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
5160: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
5170: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
5180: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
5190: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
51a0: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
51b0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
51c0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
51d0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
51e0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
51f0: 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
5200: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
5210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5220: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5230: 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  d OpenEphemeral 
5240: 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20  instr. */.      
5250: 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20    int iJump;    
5260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5270: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  p destination */
5280: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
5290: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
52a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
52b0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20   content */..   
52c0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
52d0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70   space for the p
52e0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
52f0: 20 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d         regPrev =
5300: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
5310: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5320: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
5330: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Col;..        /*
5340: 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   Change the OP_O
5350: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64  penEphemeral cod
5360: 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e  ed earlier to an
5370: 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20   OP_Null.       
5380: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d   ** sets the MEM
5390: 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20  _Cleared bit on 
53a0: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
53b0: 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  er of the.      
53c0: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61    ** previous va
53d0: 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  lue.  This will 
53e0: 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20  cause the OP_Ne 
53f0: 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a  below to always.
5400: 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20          ** fail 
5410: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65  on the first ite
5420: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
5430: 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  op even if the f
5440: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
5450: 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73  row is all NULLs
5460: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5480: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
5490: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
54a0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
54b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
54c0: 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  etOp(v, pDistinc
54d0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
54e0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
54f0: 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
5500: 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31       pOp->p1 = 1
5510: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5520: 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20  2 = regPrev;..  
5530: 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71        iJump = sq
5540: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5550: 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c  Addr(v) + nResul
5560: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f  tCol;.        fo
5570: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
5580: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
5590: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
55a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
55b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
55c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
55d0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
55e0: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
55f0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5610: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5620: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
5630: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
5640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5650: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5670: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
5680: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5690: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
56a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
56b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
56c0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
56d0: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
56e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
56f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5700: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5710: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5740: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5750: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
5760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5770: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
5780: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5790: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
57a0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
57b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
57c0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
57d0: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
57e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
57f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5800: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5810: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5830: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
5840: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
5850: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
5860: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
5870: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
5880: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
5890: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
58a0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
58b0: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
58c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65  , nResultCol, re
58d0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
58e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5900: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5910: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
5920: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
5930: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
5940: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
5950: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
5960: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
5970: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
5980: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
5990: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
59a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
59b0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
59c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
59d0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
59e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
59f0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
5a00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
5a10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5a20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5a50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5a60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
5a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
5a90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
5aa0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
5ab0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5ac0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ae0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
5af0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
5b00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
5b10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
5b20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
5b30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
5b40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
5b50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
5b60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
5b70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5b80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
5b90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
5ba0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
5bb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5bc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
5bd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
5be0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
5bf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5c00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5c10: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5c20: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
5c30: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
5c40: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
5c50: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
5c60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5c70: 54 5f 44 69 73 74 54 61 62 6c 65 3a 0a 20 20 20  T_DistTable:.   
5c80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
5ca0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
5cb0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5cc0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5cd0: 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
5ce0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
5cf0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
5d00: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
5d10: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5d40: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5d50: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
5d60: 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  r1);.#ifndef SQL
5d70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
5d80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5d90: 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b 0a 20  T_DistTable ){. 
5da0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
5db0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
5dc0: 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65 6e 20  DistTable, then 
5dd0: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
5de0: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
5df0: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
5e00: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
5e10: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
5e20: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
5e30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
5e40: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
5e50: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
5e60: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
5e70: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
5e80: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
5e90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
5ea0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
5eb0: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
5ec0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
5ed0: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
5ee0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
5ef0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
5f00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5f10: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
5f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5f30: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5f40: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
5f50: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
5f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f70: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5f80: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b  t, iParm+1, r1);
5f90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5fa0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a   pOrderBy==0 );.
5fb0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5fc0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5fd0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5fe0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5ff0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
6000: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
6010: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
6020: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
6030: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6060: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
6070: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
6080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6090: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
60a0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
60b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
60c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
60d0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
60e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
60f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6100: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
6110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6120: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6130: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
6140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
6150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6160: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
6170: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
6180: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
6190: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
61a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
61b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
61c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
61d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
61e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
61f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
6200: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
6210: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
6220: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
6230: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6250: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
6260: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
6270: 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20  Sdst =.         
6280: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6290: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
62a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
62b0: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
62c0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
62d0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
62e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
62f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
6300: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
6310: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
6320: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
6330: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
6340: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
6350: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6360: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
6370: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
6380: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
6390: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
63a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
63b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
63c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
63d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
63e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
63f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
6400: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
6410: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6420: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
6430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6440: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
6470: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6480: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
6490: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
64a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
64b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
64c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
64d0: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6500: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6520: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6530: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6540: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6560: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
6570: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6580: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
6590: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
65a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
65b0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
65c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
65d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
65e0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
65f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6600: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6610: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6620: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6640: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6650: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
6660: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
6670: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
6680: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
6690: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
66a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
66b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
66c0: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
66d0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
66e0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
66f0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6700: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
6710: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
6720: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6730: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
6740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
6750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
6760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6780: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6790: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
67a0: 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29  esult, iParm, 1)
67b0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
67c0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
67d0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
67e0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
67f0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
6800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6810: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
6820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6830: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
6840: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
6850: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
6860: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
6870: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
6880: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
6890: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
68a0: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
68b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
68c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
68d0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
68e0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
68f0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6900: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6910: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6920: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6930: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6960: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6970: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
6980: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
6990: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
69a0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
69b0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
69c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
69d0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
69e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
69f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6a00: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a20: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6a30: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6a40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6a50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
6a70: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
6a80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
6a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6aa0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
6ab0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
6ac0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6ad0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6af0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6b00: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
6b10: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
6b20: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
6b30: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
6b40: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
6b50: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
6b60: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
6b70: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
6b80: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
6b90: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
6ba0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
6bb0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
6bc0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
6bd0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
6be0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
6bf0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
6c00: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
6c10: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
6c20: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
6c30: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
6c40: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
6c50: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
6c60: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
6c70: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
6c80: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
6c90: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
6ca0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
6cb0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
6cc0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
6cd0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
6ce0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
6cf0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
6d00: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
6d10: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
6d20: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
6d30: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
6d40: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
6d50: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
6d60: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6d70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6d80: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
6d90: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
6da0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
6db0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
6dc0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c  Key+1;.      sql
6dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6de0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6df0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6e00: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
6e10: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6e20: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
6e30: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
6e40: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
6e50: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
6e60: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
6e70: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
6e80: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
6e90: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
6ea0: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
6eb0: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
6ec0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
6ed0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
6ee0: 75 65 75 65 2e 20 20 4f 6e 6c 79 20 61 64 64 20  ueue.  Only add 
6ef0: 74 68 69 73 20 6e 65 77 20 76 61 6c 75 65 20 69  this new value i
6f00: 66 20 69 74 20 68 61 73 20 6e 65 76 65 72 20 62  f it has never b
6f10: 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  efore.        **
6f20: 20 62 65 65 6e 20 61 64 64 65 64 20 2a 2f 0a 20   been added */. 
6f30: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
6f40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6f50: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
6f60: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
6f70: 72 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r3, 0);.        
6f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f90: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6fa0: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b  t, iParm+1, r3);
6fb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6fc0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6fd0: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6fe0: 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SULT);.      }. 
6ff0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7000: 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nKey; i++){.    
7010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7020: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
7030: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
7050: 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b  Result + pSO->a[
7060: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
7070: 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20  ol - 1,.        
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d    r2+i);.      }
70a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
70b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
70c0: 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20  equence, iParm, 
70d0: 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  r2+nKey);.      
70e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
70f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7100: 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20  rd, r2, nKey+2, 
7110: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
7120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7130: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7140: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
7150: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
7160: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7170: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
7180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
7190: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
71a0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
71b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
71c0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
71d0: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
71e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
71f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7200: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
7210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7220: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
7230: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
7240: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
7250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
7260: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7270: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
7280: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
7290: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
72a0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
72b0: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
72c0: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
72d0: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
72e0: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
72f0: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
7300: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
7310: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
7320: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
7330: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
7340: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7350: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
7360: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
7370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7380: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
7390: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
73a0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
73b0: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
73c0: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
73d0: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
73e0: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
73f0: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
7400: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
7410: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
7420: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
7430: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
7440: 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  rBy==0 && p->iLi
7450: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
7460: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7470: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
7480: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
7490: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
74a0: 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  Allocate a KeyIn
74b0: 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  fo object suffic
74c0: 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ient for an inde
74d0: 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d  x of N key colum
74e0: 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72  ns and.** X extr
74f0: 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65  a columns..*/.Ke
7500: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
7510: 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74  yInfoAlloc(sqlit
7520: 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69  e3 *db, int N, i
7530: 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  nt X){.  KeyInfo
7540: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
7550: 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20  allocZero(0, .  
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
7580: 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66   + (N+X)*(sizeof
7590: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a  (CollSeq*)+1));.
75a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
75b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
75c0: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
75d0: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c  X];.    p->nFiel
75e0: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
75f0: 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31  p->nXField = (u1
7600: 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20  6)X;.    p->enc 
7610: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
7620: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
7630: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65  ->nRef = 1;.  }e
7640: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  lse{.    db->mal
7650: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
7660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7670: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
7680: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
7690: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
76a0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
76b0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
76c0: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
76d0: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
76e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
76f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
7700: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
7710: 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ee(0, p);.  }.}.
7720: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
7730: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
7740: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
7750: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
7760: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
7770: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
7780: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7790: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
77a0: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
77b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
77c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
77d0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
77e0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
77f0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
7800: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
7810: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
7820: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
7830: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
7840: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
7850: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
7860: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
7870: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
7880: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
7890: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
78a0: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
78b0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
78c0: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
78d0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
78e0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
78f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
7900: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
7910: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7920: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
7930: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
7940: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
7950: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
7960: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
7970: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
7980: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
7990: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
79a0: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
79b0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
79c0: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
79d0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
79e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
79f0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
7a00: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
7a10: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
7a20: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
7a30: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
7a40: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
7a50: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
7a60: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
7a70: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
7a80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
7a90: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7aa0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
7ab0: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
7ac0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
7ad0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
7ae0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
7af0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
7b00: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
7b10: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
7b20: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
7b30: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
7b40: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
7b50: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
7b60: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
7b70: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
7b80: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
7b90: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
7ba0: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
7bb0: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7bc0: 69 73 74 2c 20 69 6e 74 20 6e 45 78 74 72 61 29  ist, int nExtra)
7bd0: 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  {.  int nExpr;. 
7be0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
7bf0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
7c00: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
7c10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7c20: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7c30: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
7c40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
7c50: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  pInfo = sqlite3K
7c60: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
7c70: 6e 45 78 70 72 2b 6e 45 78 74 72 61 2c 20 31 29  nExpr+nExtra, 1)
7c80: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
7c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7ca0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
7cb0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
7cc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
7cd0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
7ce0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
7cf0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
7d00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
7d10: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
7d20: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7d30: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
7d40: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
7d50: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
7d60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
7d70: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
7d80: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
7d90: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
7da0: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
7db0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7dc0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7dd0: 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Info;.}..#ifndef
7de0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7df0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
7e00: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
7e10: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
7e20: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
7e30: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
7e40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7e50: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
7e60: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
7e70: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
7e80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7e90: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
7ea0: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
7eb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7ec0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
7ed0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
7ee0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7ef0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
7f00: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
7f10: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
7f20: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
7f30: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
7f40: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
7f50: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
7f60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7f70: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7f80: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7f90: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7fa0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
7fb0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
7fc0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
7fd0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
7fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7ff0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
8000: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
8010: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
8020: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
8030: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
8040: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
8050: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
8060: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
8070: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
8080: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
8090: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
80a0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
80b0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
80c0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
80d0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
80e0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
80f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8100: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
8110: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
8120: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
8130: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
8140: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8150: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
8160: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8170: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
8180: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
8190: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
81a0: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
81b0: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
81c0: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
81d0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
81e0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
81f0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
8200: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
8210: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
8220: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
8230: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
8240: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
8250: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
8260: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
8270: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
8280: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8290: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
82a0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
82b0: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
82c0: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
82d0: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
82e0: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
82f0: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
8300: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
8310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8320: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
8330: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
8340: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
8350: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
8360: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
8370: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
8380: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
8390: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
83a0: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
83b0: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
83c0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
83d0: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
83e0: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
83f0: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
8400: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
8410: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
8420: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8430: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8440: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
8450: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8460: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
8470: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
8480: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
8490: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
84a0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
84b0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
84c0: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
84d0: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
84e0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
84f0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
8500: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
8510: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
8520: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
8530: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
8540: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
8550: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
8560: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
8570: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
8580: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
8590: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
85a0: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
85b0: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
85c0: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
85d0: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
85e0: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
85f0: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
8600: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
8610: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
8620: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
8630: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
8640: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
8650: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
8660: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
8670: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
8680: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
8690: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
86a0: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
86b0: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
86c0: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
86d0: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
86e0: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
86f0: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
8700: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
8710: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
8720: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
8730: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
8740: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
8750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
8760: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8780: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
8790: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
87a0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
87d0: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
87e0: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
87f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8800: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
8810: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
8840: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
8850: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
8860: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
8870: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
8880: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
8890: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
88a0: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
88b0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
88c0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
88d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
88e0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
88f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
8900: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
8910: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
8920: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
8930: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
8940: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
8950: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
8960: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
8970: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
8980: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
8990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
89a0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
89b0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
89c0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
89d0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
89e0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
89f0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
8a00: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
8a10: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
8a20: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
8a30: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
8a40: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
8a50: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
8a60: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
8a70: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
8a80: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
8a90: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
8aa0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
8ab0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
8ac0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
8ad0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
8ae0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
8af0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
8b00: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
8b10: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
8b20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
8b30: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
8b40: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
8b50: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
8b60: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
8b70: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
8b80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8b90: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8ba0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
8bb0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
8bc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8bd0: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
8be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
8bf0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
8c00: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
8c10: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
8c20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
8c30: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
8c40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
8c50: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
8c60: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
8c70: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8c80: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
8c90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8ca0: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
8cb0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
8cc0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
8cd0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
8ce0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
8cf0: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
8d00: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
8d10: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
8d20: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
8d30: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
8d40: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
8d50: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
8d60: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
8d70: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
8d80: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
8d90: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
8da0: 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  m;..  int regRow
8db0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
8dc0: 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64  ;..  iTab = pOrd
8dd0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  erBy->iECursor;.
8de0: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
8df0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8e00: 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73  rse);.  if( eDes
8e10: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
8e20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
8e30: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
8e40: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
8e50: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
8e60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8e70: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
8e80: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
8e90: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
8ea0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
8eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
8ec0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
8ed0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8ee0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8ef0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
8f00: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
8f10: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
8f20: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8f30: 20 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20      int ptab2 = 
8f40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8f70: 50 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72  Pseudo, ptab2, r
8f80: 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65  egSortOut, pOrde
8f90: 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
8fa0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
8fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8fc0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
8fd0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
8fe0: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
8ff0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9000: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
9010: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9020: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
9030: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
9040: 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  egSortOut);.    
9050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9060: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
9070: 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d  ptab2, pOrderBy-
9080: 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77  >nExpr+1, regRow
9090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
90a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
90b0: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
90c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
90d0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
90e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
90f0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
9100: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
9110: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9120: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
9130: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
9140: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9150: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
9160: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9170: 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d  +1, regRow);.  }
9180: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
9190: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
91a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
91b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
91c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
91d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
91e0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
91f0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9200: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
9210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9220: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
9230: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
9240: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
9250: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9260: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
9270: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
9280: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
9290: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
92a0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
92b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92c0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
92d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
92e0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
92f0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
9300: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
9310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9320: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9330: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9340: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
9350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9360: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
9370: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
9380: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9390: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
93a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
93b0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
93c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
93d0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
93e0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
93f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9400: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
9410: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
9420: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
9430: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
9440: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
9450: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
9460: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
9470: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
9480: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
9490: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
94a0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
94b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
94c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
94d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
94e0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
94f0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
9500: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
9510: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
9520: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9530: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
9540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9550: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
9560: 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ne );.      for(
9570: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
9580: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
9590: 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44  sert( regRow!=pD
95a0: 65 73 74 2d 3e 69 53 64 73 74 2b 69 20 29 3b 0a  est->iSdst+i );.
95b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
95c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
95d0: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
95e0: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 53 64  b, i, pDest->iSd
95f0: 73 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69  st+i);.        i
9600: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9620: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
9630: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
9640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9650: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
9660: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
9670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9680: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9690: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
96a0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
96b0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
96c0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
96d0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
96e0: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
96f0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
9700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9720: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
9730: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9760: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
9770: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
9780: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
9790: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
97a0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
97b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
97c0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
97d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
97e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
97f0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
9800: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
9810: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
9820: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
9830: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9840: 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61  _SorterNext, iTa
9850: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73  b, addr);.  }els
9860: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
9870: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9880: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
9890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
98a0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
98b0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
98c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
98d0: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
98e0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
98f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9900: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
9910: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
9920: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
9930: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
9940: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
9950: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
9960: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
9970: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
9980: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
9990: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
99a0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
99b0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
99c0: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
99d0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
99e0: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
99f0: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
9a00: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
9a10: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
9a20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
9a30: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
9a40: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
9a50: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
9a60: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
9a70: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
9a80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9a90: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
9aa0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
9ab0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
9ac0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
9ad0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
9ae0: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
9af0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
9b00: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
9b10: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
9b20: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
9b30: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
9b40: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
9b50: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
9b60: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
9b70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9b80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9b90: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
9ba0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
9bb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
9bc0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
9bd0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
9be0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
9bf0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
9c00: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
9c10: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
9c20: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
9c30: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
9c40: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
9c50: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
9c60: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
9c70: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
9c80: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
9c90: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
9ca0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9cb0: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
9cc0: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
9cd0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
9ce0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
9cf0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
9d00: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
9d10: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
9d20: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
9d30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9d40: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9d50: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
9d60: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
9d70: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
9d80: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
9d90: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
9da0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
9db0: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
9dc0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
9dd0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
9de0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
9df0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9e00: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
9e10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9e20: 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45  rigCol,.  u8 *pE
9e30: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
9e40: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62  r const *zOrigDb
9e50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
9e60: 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  st *zOrigTab = 0
9e70: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
9e80: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65  zOrigCol = 0;.#e
9e90: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
9ea0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9eb0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9ec0: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
9ed0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
9ee0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
9ef0: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74  Impl(A,B,F).stat
9f00: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
9f10: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
9f20: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
9f30: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
9f40: 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  r,.  u8 *pEstWid
9f50: 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20  th.){.#endif /* 
9f60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9f70: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9f80: 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61  TADATA) */.  cha
9f90: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
9fa0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
9fb0: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
9fc0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
9fd0: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
9fe0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
9ff0: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
a000: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
a010: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
a020: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
a030: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
a040: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a050: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
a060: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
a070: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
a080: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
a090: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
a0a0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
a0b0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
a0c0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
a0d0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a0e0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
a0f0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
a100: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
a110: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a120: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
a130: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
a140: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
a150: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
a160: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a170: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
a180: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
a190: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
a1a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
a1b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
a1c0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
a1d0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
a1e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a1f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
a200: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
a210: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a220: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
a230: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
a240: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
a250: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
a260: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
a270: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
a280: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
a290: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
a2a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
a2b0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
a2c0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
a2d0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
a2e0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
a2f0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
a300: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
a310: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
a320: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
a330: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
a340: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
a350: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
a360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a370: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
a380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
a390: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
a3a0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
a3b0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
a3c0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
a3d0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
a3e0: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
a3f0: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
a400: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
a410: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
a420: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
a430: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
a440: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
a450: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
a460: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
a470: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
a480: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
a490: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
a4a0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
a4b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
a4c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
a4d0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a4e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a4f0: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
a500: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
a510: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
a520: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
a530: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
a540: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
a550: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
a560: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
a570: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
a580: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
a590: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
a5a0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
a5b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
a5c0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
a5d0: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
a5e0: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
a5f0: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
a600: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a610: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
a620: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
a630: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
a640: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
a650: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
a660: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
a670: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
a680: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
a690: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
a6a0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
a6b0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
a6c0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
a6d0: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
a6e0: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
a6f0: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
a700: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
a720: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
a730: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
a740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
a750: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
a760: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
a770: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
a780: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
a790: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
a7a0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
a7b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a7c0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
a7d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
a7e0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
a7f0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
a800: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
a810: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
a820: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
a830: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
a840: 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ol>=0 && ALWAYS(
a850: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
a860: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
a870: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
a880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
a890: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
a8a0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
a8b0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
a8c0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
a8d0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
a8e0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
a8f0: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
a900: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
a910: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
a920: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
a930: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
a940: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
a950: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
a960: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
a970: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
a980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
a990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
a9a0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
a9b0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
a9c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
a9d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
a9e0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
a9f0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
aa00: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
aa10: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
aa20: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
aa30: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
aa40: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
aa50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
aa60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
aa70: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
aa80: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
aa90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aaa0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
aab0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
aac0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
aad0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aae0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
aaf0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
ab00: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
ab10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ab20: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
ab30: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
ab40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
ab50: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
ab60: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
ab70: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
ab80: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
ab90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
aba0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
abb0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
abc0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
abd0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
abe0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
abf0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
ac00: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
ac10: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
ac20: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
ac30: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
ac40: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
ac50: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
ac60: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
ac70: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ac80: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
ac90: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
aca0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
acb0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
acc0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
acd0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
ace0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
acf0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ad00: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ad10: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
ad20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ad30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
ad40: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
ad50: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
ad60: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
ad70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
ad80: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
ad90: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
ada0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
adb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
adc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
add0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
ade0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
adf0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
ae00: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
ae10: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
ae20: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
ae30: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
ae40: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
ae50: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ae60: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
ae70: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
ae80: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
ae90: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
aea0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
aeb0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
aec0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
aed0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
aee0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
aef0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
af00: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
af10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
af20: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
af30: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
af40: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
af50: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
af60: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
af70: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
af80: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
af90: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
afa0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
afb0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
afc0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
afd0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
afe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
aff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b000: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b010: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
b020: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
b030: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
b040: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
b050: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
b060: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
b070: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
b080: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
b090: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
b0a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
b0b0: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
b0c0: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
b0d0: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
b0e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
b0f0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
b100: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
b110: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
b120: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
b130: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
b140: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
b150: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
b160: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
b170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b180: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
b190: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
b1a0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
b1b0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
b1c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
b1d0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
b1e0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
b1f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b200: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b210: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
b220: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
b230: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
b240: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
b250: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
b260: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
b270: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
b280: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
b290: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
b2a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b2b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
b2c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
b2d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b2e0: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
b2f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b300: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
b310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
b320: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
b330: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
b340: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
b350: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
b360: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
b370: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
b380: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
b390: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
b3a0: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
b3b0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
b3c0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
b3d0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
b3e0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
b3f0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
b400: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
b410: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
b420: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
b430: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
b440: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
b450: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
b460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b470: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b480: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
b490: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
b4a0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
b4b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b4c0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b4d0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
b4e0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
b4f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
b500: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b510: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b520: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
b530: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
b540: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
b550: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
b560: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
b570: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
b580: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
b590: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
b5a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
b5b0: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
b5c0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
b5d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b5e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b5f0: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
b600: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b610: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
b620: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
b630: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
b640: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
b650: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
b660: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
b670: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
b680: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
b690: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
b6a0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
b6b0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
b6c0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
b6d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
b6e0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
b6f0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
b700: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
b710: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
b720: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b730: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b740: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
b750: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
b760: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
b770: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
b780: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
b790: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b7a0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
b7b0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
b7c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b7d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
b7e0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
b7f0: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
b800: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
b810: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
b820: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
b830: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
b840: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
b850: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
b860: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
b870: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
b880: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
b890: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
b8a0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
b8b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
b8c0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
b8d0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
b8e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
b8f0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b900: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
b910: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
b920: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
b930: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b940: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b950: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b960: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
b970: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
b980: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
b990: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
b9a0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b9b0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
b9c0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b9d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b9e0: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
b9f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ba00: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ba10: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
ba20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ba30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
ba40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
ba50: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
ba60: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
ba70: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
ba80: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
ba90: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
baa0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
bab0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
bac0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
bad0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
bae0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
baf0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
bb00: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
bb10: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
bb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
bb30: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
bb40: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
bb50: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bb60: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bb70: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
bb80: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
bb90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bba0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
bbb0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
bbc0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
bbd0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
bbe0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
bbf0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
bc00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
bc10: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
bc20: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
bc30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
bc40: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
bc50: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
bc60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
bc70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
bc80: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
bc90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bca0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
bcb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
bcc0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
bcd0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
bce0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
bcf0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
bd00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
bd10: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
bd20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
bd30: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
bd40: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
bd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
bd60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
bd70: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
bd80: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
bd90: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
bda0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bdb0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
bdc0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
bdd0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
bde0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
bdf0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
be00: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
be10: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
be20: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
be30: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
be40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
be50: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
be60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
be70: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
be80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
be90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
bea0: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
beb0: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
bec0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
bed0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
bee0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
bef0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
bf00: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
bf10: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
bf20: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
bf30: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
bf40: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
bf50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
bf60: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
bf70: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
bf80: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
bf90: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
bfa0: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
bfb0: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
bfc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
bfd0: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
bfe0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
bff0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
c000: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
c010: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
c020: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
c030: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
c040: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
c050: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
c060: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
c070: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
c080: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
c090: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
c0a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
c0b0: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
c0c0: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
c0d0: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
c0e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
c0f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
c100: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
c110: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
c120: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
c150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
c160: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
c170: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
c180: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
c190: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1b0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
c1c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
c1d0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
c1e0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
c1f0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
c200: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
c210: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c220: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c230: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
c240: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c250: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
c260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c270: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
c280: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2a0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
c2b0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
c2c0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
c2d0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
c2e0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
c2f0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
c300: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
c310: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
c320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c330: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
c340: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c380: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
c390: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
c3a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c3c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
c3d0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c3f0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
c400: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28  Name[] */..  if(
c410: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e   pEList ){.    n
c420: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
c430: 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  xpr;.    aCol = 
c440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c450: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
c460: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
c470: 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f     testcase( aCo
c480: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==0 );.  }else{
c490: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
c4a0: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
c4b0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
c4c0: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
c4d0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
c4e0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
c4f0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c500: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
c510: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
c520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
c530: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
c540: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
c550: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
c560: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
c570: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
c580: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
c590: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
c5a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
c5b0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
c5c0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
c5d0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
c5e0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
c5f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c600: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
c610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c620: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
c630: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
c640: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
c650: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
c660: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
c670: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
c680: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
c690: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
c6a0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
c6b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
c6c0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
c6d0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
c6e0: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
c6f0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
c700: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
c710: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
c720: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
c730: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c740: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
c750: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
c760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
c770: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
c780: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
c790: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
c7a0: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
c7b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
c7c0: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
c7d0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
c7e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c7f0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c800: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
c810: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c820: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
c840: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
c850: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
c860: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
c870: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
c880: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
c890: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
c8a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
c8b0: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
c8c0: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
c8d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
c8e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c8f0: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
c900: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
c910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c920: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
c930: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
c940: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
c950: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
c960: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c970: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c980: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
c990: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
c9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c9b0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c9c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
c9d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c9e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
c9f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
ca00: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ca10: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
ca20: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
ca30: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
ca40: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
ca50: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
ca60: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
ca70: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
ca80: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
ca90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
caa0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
cab0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
cac0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
cad0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
cae0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
caf0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
cb00: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
cb10: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
cb20: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
cb30: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
cb40: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
cb50: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
cb60: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
cb70: 28 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20  ( zName[k]==':' 
cb80: 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20  ) nName = k;.   
cb90: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
cba0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
cbb0: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
cbc0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
cbd0: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
cbe0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
cbf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cc00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
cc10: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
cc20: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
cc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
cc40: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
cc50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cc60: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
cc70: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
cc80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
cca0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
ccb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ccc0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
ccd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
cce0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ccf0: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
cd00: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
cd10: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
cd20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
cd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cd40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cd50: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
cd60: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
cd70: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
cd80: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
cd90: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
cda0: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
cdb0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
cdc0: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
cdd0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
cde0: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
cdf0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
ce00: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
ce10: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
ce20: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
ce30: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
ce40: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
ce50: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
ce60: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ce80: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
ce90: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
cea0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
ceb0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
cec0: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
ced0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
cee0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
cef0: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
cf00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
cf10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cf20: 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
cf30: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
cf40: 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
cf50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
cf60: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
cf70: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
cf80: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
cf90: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
cfa0: 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
cfb0: 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  lations */.){.  
cfc0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cfd0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65  arse->db;.  Name
cfe0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43  Context sNC;.  C
cff0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43  olumn *pCol;.  C
d000: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
d010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
d020: 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  p;.  struct Expr
d030: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
d040: 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a  u64 szAll = 0;..
d050: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
d060: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
d070: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
d080: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
d090: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
d0a0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
d0b0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
d0c0: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
d0d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d0e0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d0f0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
d100: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
d110: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
d120: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d130: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
d140: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
d150: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
d160: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
d170: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
d180: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
d190: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
d1a0: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
d1b0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
d1c0: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
d1d0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c  nType(&sNC, p,0,
d1e0: 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73  0,0, &pCol->szEs
d1f0: 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b  t));.    szAll +
d200: 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  = pCol->szEst;. 
d210: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
d220: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
d230: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
d240: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
d250: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
d260: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
d270: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43  AFF_NONE;.    pC
d280: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d290: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d2a0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
d2b0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
d2c0: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
d2d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
d2e0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
d2f0: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73   }.  }.  pTab->s
d300: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d310: 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29  3LogEst(szAll*4)
d320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
d330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d340: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
d350: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
d360: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
d370: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
d380: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
d390: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
d3a0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d3b0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
d3c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
d3d0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
d3e0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
d3f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d400: 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73    int savedFlags
d410: 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20  ;..  savedFlags 
d420: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64  = db->flags;.  d
d430: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
d440: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d450: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
d460: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
d470: 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  Names;.  sqlite3
d480: 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
d490: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e, pSelect, 0);.
d4a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
d4b0: 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
d4c0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
d4d0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
d4e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
d4f0: 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ior;.  db->flags
d500: 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20   = savedFlags;. 
d510: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
d520: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d530: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
d540: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
d550: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d560: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c    }.  /* The sql
d570: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
d580: 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20  elect() is only 
d590: 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20  used n contexts 
d5a0: 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a  where lookaside.
d5b0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
d5c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
d5d0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
d5e0: 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61  bled==0 );.  pTa
d5f0: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
d600: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  Tab->zName = 0;.
d610: 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
d620: 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 73 65 6c  = 1048576;.  sel
d630: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d640: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
d650: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
d660: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
d670: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
d680: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
d690: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
d6a0: 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
d6b0: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
d6c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
d6d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d6e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d6f0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
d700: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
d710: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d720: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
d730: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
d740: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
d750: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
d760: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
d770: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
d780: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
d790: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
d7a0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
d7b0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
d7c0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
d7d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
d7e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
d7f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
d800: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
d810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
d830: 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  eate(pParse);.  
d840: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
d850: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
d860: 50 5f 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 72  P_Init);.  }.  r
d870: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
d880: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
d890: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
d8a0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
d8b0: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
d8c0: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
d8d0: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
d8e0: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
d8f0: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
d900: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
d910: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
d920: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
d930: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
d940: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
d950: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
d960: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
d970: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
d980: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
d990: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
d9a0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
d9b0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
d9c0: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
d9d0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
d9e0: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
d9f0: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
da00: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
da10: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
da20: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
da30: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
da40: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
da50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
da60: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
da70: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
da80: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
da90: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
daa0: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
dab0: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
dac0: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
dad0: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
dae0: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
daf0: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
db00: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
db10: 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
db20: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
db30: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
db40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
db50: 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
db60: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
db70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
db80: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
db90: 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
dba0: 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
dbb0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
dbc0: 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
dbd0: 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
dbe0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
dbf0: 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
dc00: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
dc10: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
dc20: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
dc30: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
dc40: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
dc50: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
dc60: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
dc70: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
dc80: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
dc90: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
dca0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
dcb0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
dcc0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
dcd0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
dce0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
dcf0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
dd00: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
dd10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
dd20: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
dd30: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
dd40: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
dd50: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
dd60: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
dd70: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
dd80: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
dd90: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
dda0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
ddb0: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
ddc0: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
ddd0: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
dde0: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
ddf0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
de00: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
de10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
de20: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
de30: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
de40: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
de50: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
de60: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
de70: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
de80: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
de90: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
dea0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
deb0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
dec0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
ded0: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
dee0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
def0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
df00: 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
df10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
df20: 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
df30: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
df40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
df60: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
df70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
df80: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
df90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
dfa0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
dfb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dfc0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
dfd0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
dfe0: 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
dff0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36  ->nSelectRow>(u6
e000: 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  4)n ){.        p
e010: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
e020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e030: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e040: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e050: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
e060: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
e070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e080: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e090: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
e0a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e0b0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
e0c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e0d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e0e0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
e0f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
e100: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
e110: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
e120: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
e130: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e140: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
e150: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
e160: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
e170: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
e180: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
e190: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e1a0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
e1b0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
e1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e1d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e1e0: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
e1f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
e200: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
e210: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
e220: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e230: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e240: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
e250: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e270: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
e280: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
e290: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e2a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
e2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
e2d0: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
e2e0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
e2f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e300: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
e310: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
e320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e330: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
e340: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e360: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e370: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
e380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e390: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e3a0: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
e3b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e3c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e3d0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
e3e0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
e3f0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
e400: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
e410: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
e420: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
e430: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
e440: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
e450: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
e460: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
e470: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
e480: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
e490: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
e4a0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
e4b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e4c0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
e4d0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
e4e0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
e4f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
e500: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
e510: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
e530: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
e540: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
e550: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e560: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
e570: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
e580: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
e590: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
e5a0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
e5b0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
e5c0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
e5d0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
e5e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
e5f0: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
e600: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
e610: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
e620: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
e630: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e640: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
e650: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
e660: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
e670: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
e680: 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
e690: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
e6a0: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
e6b0: 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
e6c0: 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
e6d0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
e6e0: 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
e6f0: 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
e700: 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
e710: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
e720: 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
e730: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
e740: 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
e750: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
e760: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
e770: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
e780: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
e790: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
e7a0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
e7b0: 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
e7c0: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
e7d0: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
e7e0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
e7f0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
e800: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
e810: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
e820: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e830: 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
e840: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
e850: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
e860: 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
e870: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
e880: 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
e890: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e8a0: 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
e8b0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
e8c0: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
e8d0: 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
e8e0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
e8f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e900: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
e910: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
e920: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e930: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
e940: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
e950: 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
e960: 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
e970: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
e980: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
e990: 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
e9a0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
e9b0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
e9c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e9d0: 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
e9e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e9f0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
ea00: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
ea10: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
ea20: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
ea30: 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
ea40: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
ea50: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
ea60: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
ea70: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
ea80: 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
ea90: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
eaa0: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
eab0: 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
eac0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
ead0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
eae0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
eaf0: 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
eb00: 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
eb10: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
eb20: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
eb30: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
eb40: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
eb50: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
eb60: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
eb70: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
eb80: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
eb90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
eba0: 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
ebb0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
ebc0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
ebd0: 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
ebe0: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
ebf0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
ec00: 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
ec10: 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
ec20: 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
ec30: 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
ec40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ec50: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
ec60: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
ec70: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
ec80: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
ecd0: 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
ece0: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
ecf0: 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
ed00: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
ed10: 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
ed20: 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
ed30: 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
ed40: 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75  List->a[].isRecu
ed50: 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
ed60: 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
ed70: 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
ed80: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
ed90: 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
eda0: 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
edb0: 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
edc0: 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
edd0: 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
ede0: 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
edf0: 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
ee00: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
ee10: 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
ee20: 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
ee30: 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
ee40: 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
ee50: 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
ee60: 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
ee70: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
ee80: 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
ee90: 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
eea0: 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
eeb0: 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
eec0: 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
eed0: 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
eee0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
eef0: 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
ef00: 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
ef10: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
ef20: 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
ef30: 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
ef40: 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
ef50: 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
ef60: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
ef70: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
ef80: 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
ef90: 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
efa0: 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
efb0: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
efc0: 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
efd0: 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
efe0: 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
eff0: 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
f000: 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
f010: 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
f020: 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
f030: 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
f040: 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
f050: 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
f060: 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
f070: 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
f080: 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
f090: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
f0a0: 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
f0b0: 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
f0c0: 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
f0d0: 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
f0e0: 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
f0f0: 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
f100: 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
f110: 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
f120: 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
f130: 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
f140: 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
f150: 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
f160: 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
f170: 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
f180: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
f190: 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
f1a0: 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
f1b0: 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
f1c0: 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
f1d0: 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
f1e0: 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
f1f0: 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
f200: 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
f210: 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
f220: 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
f230: 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
f240: 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
f250: 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
f260: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
f270: 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
f280: 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
f290: 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
f2a0: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
f2b0: 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
f2c0: 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
f2d0: 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
f2e0: 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
f2f0: 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
f300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f310: 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
f320: 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
f330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f340: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f350: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f360: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
f370: 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
f380: 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
f390: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
f3a0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
f3b0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
f3c0: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
f3d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
f3e0: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
f3f0: 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
f400: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
f410: 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
f420: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
f430: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
f440: 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
f450: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f460: 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
f470: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
f480: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
f490: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
f4a0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
f4b0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f4c0: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
f4d0: 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
f4e0: 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
f4f0: 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
f500: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
f510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
f520: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
f530: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
f540: 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
f550: 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
f560: 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
f570: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
f580: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
f590: 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
f5a0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
f5b0: 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f5d0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
f5e0: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
f5f0: 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
f620: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
f630: 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
f640: 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
f650: 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
f660: 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
f670: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
f680: 5f 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  _Table;        /
f690: 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
f6a0: 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
f6b0: 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
f6c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
f6d0: 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
f6e0: 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
f6f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
f720: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
f730: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
f750: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
f760: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
f770: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
f780: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f790: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
f7a0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
f7b0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
f7c0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
f7d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
f7e0: 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
f7f0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
f800: 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
f810: 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
f820: 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
f830: 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
f840: 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
f850: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
f860: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f870: 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
f880: 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
f890: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
f8a0: 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
f8b0: 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
f8c0: 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
f8d0: 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
f8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
f8f0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
f900: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
f910: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
f920: 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
f930: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
f940: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
f950: 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
f960: 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
f970: 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
f980: 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
f990: 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
f9a0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
f9b0: 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
f9c0: 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
f9d0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
f9e0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
f9f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
fa00: 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
fa10: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
fa20: 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
fa30: 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
fa40: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
fa50: 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
fa60: 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
fa70: 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
fa80: 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
fa90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
faa0: 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
fab0: 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
fac0: 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
fad0: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
fae0: 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
faf0: 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
fb00: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
fb10: 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
fb20: 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
fb30: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
fb40: 54 5f 44 69 73 74 54 61 62 6c 65 20 61 6e 64 20  T_DistTable and 
fb50: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
fb60: 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
fb70: 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
fb80: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fb90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
fba0: 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
fbb0: 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
fbc0: 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
fbd0: 3a 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3b  : SRT_DistTable;
fbe0: 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
fbf0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fc00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
fc10: 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
fc20: 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
fc30: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71  _Table;.  }.  sq
fc40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fc50: 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
fc60: 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
fc70: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
fc80: 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
fc90: 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
fca0: 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
fcb0: 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
fcc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
fcd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fce0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
fcf0: 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
fd00: 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
fd10: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
fd20: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fd30: 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
fd40: 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
fd50: 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
fd60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fd70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
fd80: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
fd90: 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
fda0: 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
fdd0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
fde0: 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
fdf0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
fe00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fe10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fe20: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
fe30: 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
fe40: 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
fe50: 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
fe60: 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
fe70: 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
fe80: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
fe90: 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
fea0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
feb0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
fec0: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
fed0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
fee0: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
fef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
ff00: 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
ff10: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
ff20: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
ff30: 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
ff40: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
ff50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
ff60: 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
ff70: 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
ff80: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ff90: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
ffa0: 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
ffb0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
ffc0: 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
ffd0: 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69  _query;..  /* Fi
ffe0: 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
fff0: 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64  in the Queue and
10000 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77   output that row
10010 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
10020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10030 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10040 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61  iQueue, addrBrea
10050 6b 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  k);..  /* Transf
10060 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
10070 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
10080 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
10090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
100a0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
100b0 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
100c0 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
100d0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
100e0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
100f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10100 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
10110 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
10120 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
10130 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
10140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10150 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
10160 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
10170 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
10180 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10190 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
101a0 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
101b0 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
101c0 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
101d0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
101e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
101f0 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
10200 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
10210 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
10220 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
10230 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
10240 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
10250 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
10260 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10270 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
10280 4c 69 6d 69 74 20 29 20 73 71 6c 69 74 65 33 56  Limit ) sqlite3V
10290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
102a0 49 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  IfZero, regLimit
102b0 2c 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31 29  , addrBreak, -1)
102c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
102d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
102e0 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
102f0 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
10300 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
10310 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
10320 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
10330 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
10340 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
10350 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
10360 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
10370 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
10380 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
10390 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
103a0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
103b0 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ueue);.  assert(
103c0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
103d0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
103e0 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Setup;..  /* Kee
103f0 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f  p running the lo
10400 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  op until the Que
10410 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ue is empty */. 
10420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10430 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
10440 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
10450 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10460 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
10470 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
10480 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
10490 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
104a0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
104b0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
104c0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
104d0 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
104e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
104f0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
10500 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
10510 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
10520 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
10530 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
10540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10550 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10560 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
10570 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10580 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
10590 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
105a0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
105b0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
105c0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
105d0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
105e0 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.);.../*.**
105f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10600 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
10610 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
10620 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
10630 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
10640 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
10650 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
10660 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
10670 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
10680 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
10690 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
106a0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
106b0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
106c0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
106d0 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
106e0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
106f0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
10700 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
10710 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
10720 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
10730 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
10740 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
10750 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
10760 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
10770 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
10780 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
10790 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
107a0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
107b0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
107c0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
107d0 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
107e0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
107f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
10800 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
10810 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
10820 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
10830 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
10840 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
10850 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
10860 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
10870 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
10880 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
10890 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
108a0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
108b0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
108c0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
108d0 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
108e0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
108f0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
10900 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
10910 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
10920 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
10930 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
10940 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
10950 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10960 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
10970 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
10980 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
10990 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
109a0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
109b0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
109c0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
109d0 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
109e0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
109f0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
10a00 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
10a10 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
10a20 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
10a30 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
10a40 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
10a50 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
10a60 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
10a70 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10a80 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10a90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ab0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
10ac0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
10ad0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
10ae0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
10af0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
10b00 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
10b10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
10b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
10b30 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
10b40 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
10b50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
10b60 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
10b70 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
10b80 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
10b90 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
10ba0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10bb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10bc0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
10bd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10be0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
10bf0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
10c00 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
10c10 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
10c20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
10c30 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
10c40 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
10c50 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
10c60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10c70 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
10c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10c90 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
10ca0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
10cb0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
10cc0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
10cd0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
10ce0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
10cf0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
10d00 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
10d10 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
10d20 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
10d30 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
10d40 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
10d50 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
10d60 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
10d70 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
10d80 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
10d90 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
10da0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
10db0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
10dc0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
10dd0 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
10de0 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
10df0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
10e00 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
10e10 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
10e20 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
10e30 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
10e40 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
10e50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10e60 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
10e70 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
10e80 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
10e90 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20  st!=pPrior );.  
10ea0 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
10eb0 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70  pRightmost==p->p
10ec0 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64  Rightmost );.  d
10ed0 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
10ee0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
10ef0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
10f00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10f10 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
10f20 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
10f30 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
10f40 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
10f50 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
10f60 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
10f70 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10f80 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
10f90 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
10fa0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
10fb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10fc0 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
10fd0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
10fe0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
10ff0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
11000 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11010 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
11020 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
11030 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
11040 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11050 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
11060 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
11070 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
11080 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
11090 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
110a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
110b0 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
110c0 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
110d0 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
110e0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
110f0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
11100 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
11110 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
11120 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11130 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11140 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
11150 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
11160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11170 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
11180 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
11190 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
111a0 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
111b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
111c0 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
111d0 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
111e0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
111f0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
11200 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
11210 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
11220 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
11230 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
11240 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
11250 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
11260 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
11270 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
11280 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
11290 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20  Values ){.      
112a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
112b0 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
112c0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
112d0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
112e0 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65   terms");.    }e
112f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
11300 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11310 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
11320 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
11330 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20  t of %s".       
11340 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
11350 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
11360 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11370 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
11380 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20  p->op));.    }. 
11390 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
113a0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
113b0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  _end;.  }..#ifnd
113c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
113d0 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
113e0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
113f0 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
11400 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
11410 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
11420 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
11430 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
11440 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
11450 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
11460 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
11470 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
11480 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
11490 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
114a0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
114b0 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
114c0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
114d0 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
114e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
114f0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
11500 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
11510 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
11520 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
11530 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
11540 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
11550 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
11560 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
11570 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
11580 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
11590 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
115a0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
115b0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
115c0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
115d0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
115e0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
115f0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
11600 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11610 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
11620 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
11630 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
11640 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
11650 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11660 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
11670 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
11680 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
11690 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
116a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
116b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
116c0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
116d0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
116e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
116f0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
11700 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
11710 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
11720 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
11730 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
11740 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
11750 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
11760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11770 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
11780 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
11790 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
117a0 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
117b0 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
117c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
117d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
117e0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
117f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
11800 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11810 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
11820 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
11830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
11840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
11850 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
11860 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11870 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
11880 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
11890 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
118a0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
118b0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
118c0 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
118d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
118e0 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
118f0 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
11900 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
11910 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
11920 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69  Row > (u64)nLimi
11930 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t .      ){.    
11940 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
11950 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  w = nLimit;.    
11960 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
11970 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
11980 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11990 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
119a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
119b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
119c0 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
119d0 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
119e0 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
119f0 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
11a00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
11a10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
11a20 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
11a30 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
11a40 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
11a50 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
11a60 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
11a70 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
11a80 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
11a90 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
11aa0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
11ab0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
11ac0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
11ad0 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
11ae0 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
11af0 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
11b00 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
11b10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
11b20 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
11b30 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
11b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
11b50 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
11b60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11b70 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11b80 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
11b90 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
11ba0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
11bb0 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
11bc0 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d   ALWAYS(!p->pLim
11bd0 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74  it &&!p->pOffset
11be0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
11bf0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
11c00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
11c10 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
11c20 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
11c30 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
11c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11c50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11c60 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a  htmost!=p );  /*
11c70 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
11c80 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c   for leftward el
11c90 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20  ements.         
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
11cc0 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72  f a 3-way or mor
11cd0 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  e compound */.  
11ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11cf0 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
11d00 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
11d10 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
11d20 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
11d30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
11d40 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
11d50 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
11d60 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
11d70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
11d80 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
11d90 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
11da0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
11db0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
11dc0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
11dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
11de0 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
11df0 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
11e00 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
11e10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
11e20 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
11e30 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
11e40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
11e50 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
11e60 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
11e70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11e80 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11e90 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
11ea0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11eb0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11ec0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
11ed0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11ee0 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
11ef0 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
11f00 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
11f10 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
11f20 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
11f30 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
11f40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11f50 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
11f60 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
11f70 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
11f80 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11f90 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
11fa0 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
11fb0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11fc0 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
11fd0 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
11fe0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
11ff0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
12000 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12010 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12020 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12030 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
12040 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
12050 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12060 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
12070 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
12080 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
12090 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
120a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
120b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
120c0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
120d0 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
120e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
120f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12110 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
12120 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
12130 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
12140 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
12150 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
12160 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
12170 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
12180 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
12190 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
121a0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
121b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
121c0 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
121d0 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
121e0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
121f0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
12200 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12210 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12220 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
12230 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
12240 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
12250 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
12260 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
12270 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
12280 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
12290 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
122a0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
122b0 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
122c0 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
122d0 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
122e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
122f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12300 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
12310 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
12320 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
12330 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
12340 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
12350 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
12360 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
12370 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
12380 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
12390 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
123a0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
123b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
123c0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
123d0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
123e0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
123f0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
12400 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
12410 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
12420 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
12430 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
12440 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
12450 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
12460 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
12470 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
12480 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
12490 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
124a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
124b0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
124c0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
124d0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
124e0 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
124f0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
12500 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
12510 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
12520 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
12530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12540 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
12550 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
12560 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
12570 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
12580 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
12590 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
125a0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
125b0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
125c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
125d0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
125e0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
125f0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
12600 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12610 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
12620 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12630 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
12640 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
12650 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12660 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
12670 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12680 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
12690 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
126a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
126b0 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
126c0 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
126d0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
126e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
126f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
12700 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
12710 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
12720 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
12730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12740 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
12750 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
12760 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
12770 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12780 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
12790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
127a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
127b0 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
127c0 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
127d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
127e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
127f0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
12800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12810 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
12820 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
12830 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12840 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
12850 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
12860 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
12870 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
12880 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
12890 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
128a0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
128b0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
128c0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
128d0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
128e0 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
128f0 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
12900 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
12910 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
12920 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
12930 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
12940 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
12950 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
12960 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
12970 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
12980 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
12990 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
129a0 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
129b0 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
129c0 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
129d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
129e0 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
129f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12a10 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
12a20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
12a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12a40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12a50 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
12a60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
12a70 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
12a80 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
12a90 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
12aa0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
12ab0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
12ac0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
12ad0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
12ae0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
12af0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
12b00 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
12b10 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
12b20 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
12b30 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
12b40 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12b50 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12b60 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
12b70 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
12b80 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
12b90 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
12ba0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
12bb0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
12bc0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12bd0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
12be0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
12bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12c00 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12c10 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12c20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12c30 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
12c40 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
12c50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12c60 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
12c70 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
12c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12c90 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12ca0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
12cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12cc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
12cd0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
12ce0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
12cf0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
12d00 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12d10 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
12d20 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
12d30 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
12d40 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
12d50 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
12d60 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
12d70 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
12d80 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
12d90 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
12da0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12db0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
12dc0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12de0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
12df0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
12e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12e10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
12e20 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
12e30 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12e40 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12e50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
12e60 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
12e70 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
12e80 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
12e90 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
12ea0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
12eb0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
12ec0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
12ed0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
12ee0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
12ef0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12f00 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
12f10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12f20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
12f30 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
12f40 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
12f50 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
12f60 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
12f70 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
12f80 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
12f90 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
12fb0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
12fc0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
12fd0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
12fe0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
12ff0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
13000 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
13010 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
13020 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
13030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13040 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
13050 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
13060 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
13070 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13080 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
13090 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
130a0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
130b0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
130c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
130d0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
130e0 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
130f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
13100 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13110 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
13120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13130 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
13140 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
13150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13160 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
13170 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
13180 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ont, r1, 0);.   
13190 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
131a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
131b0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
131c0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
131d0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
131e0 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13200 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13210 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13220 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13230 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
13240 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13260 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
13270 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
13280 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13290 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
132a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
132b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
132c0 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
132d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
132e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
132f0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
13300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13310 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
13320 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
13330 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
13340 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
13350 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
13360 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
13370 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
13380 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
13390 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
133a0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
133b0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
133c0 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
133d0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
133e0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
133f0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
13400 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
13410 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
13420 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
13430 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
13440 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
13450 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
13460 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
13470 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
13480 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
13490 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
134a0 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
134b0 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
134c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
134d0 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
134e0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
134f0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
13500 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
13510 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
13520 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13550 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
13560 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
13570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13580 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13590 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
135a0 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
135b0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
135c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
135d0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
135e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
135f0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
13600 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
13610 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
13620 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
13630 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
13640 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13670 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
13680 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
13690 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
136a0 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
136b0 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
136c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
136d0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
136e0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
136f0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
13700 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
13710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13720 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
13730 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13740 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
13750 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
13760 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
13770 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
13780 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
13790 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
137a0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
137b0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
137c0 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
137d0 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
137e0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13800 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
13810 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
13820 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
13830 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13840 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
13850 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
13860 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13870 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
13880 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
13890 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
138a0 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
138b0 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
138c0 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
138d0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
138e0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
138f0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
13900 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
13910 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
13920 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
13930 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13940 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
13950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13960 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
13970 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
13980 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
13990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
139a0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
139b0 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
139c0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
139d0 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
13a00 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
13a10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
13a20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
13a30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
13a40 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
13a50 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
13a60 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
13a70 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
13a80 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
13a90 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
13aa0 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
13ab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13ac0 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
13ad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13ae0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13af0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13b00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
13b10 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
13b20 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
13b30 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
13b40 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
13b50 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
13b60 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
13b70 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
13b80 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
13b90 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
13ba0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
13bb0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
13bc0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
13bd0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
13be0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
13bf0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
13c00 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
13c10 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
13c20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
13c30 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
13c40 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
13c50 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
13c60 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
13c70 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
13c80 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
13c90 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
13ca0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
13cb0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
13cc0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
13cd0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
13ce0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
13cf0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
13d00 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
13d10 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
13d20 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
13d30 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
13d40 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
13d50 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
13d60 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
13d70 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
13d80 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
13d90 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
13da0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
13db0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
13dc0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
13dd0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
13de0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13df0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13e00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
13e10 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
13e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
13e30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
13e40 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13e50 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
13e60 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
13e70 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
13e80 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
13e90 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
13ea0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
13eb0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
13ec0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
13ed0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
13ee0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
13ef0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
13f00 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
13f10 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
13f20 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
13f30 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
13f40 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
13f50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
13f60 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
13f70 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
13f80 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
13f90 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13fa0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
13fb0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
13fc0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
13fd0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
13fe0 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
13ff0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
14000 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14010 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
14020 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
14030 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14040 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
14050 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
14060 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
14070 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
14080 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
14090 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
140a0 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
140b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
140c0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
140d0 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
140e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
140f0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
14100 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
14110 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
14120 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
14150 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
14160 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
14170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14180 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
14190 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
141a0 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
141b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
141c0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
141d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
141e0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
141f0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
14200 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
14210 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
14220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14230 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
14240 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
14250 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
14260 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
14270 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
14280 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
14290 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
142a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
142b0 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
142c0 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
142d0 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
142e0 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
142f0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
14300 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
14310 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
14320 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
14330 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
14340 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
14350 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
14360 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
14370 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
14380 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14390 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
143a0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
143b0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
143c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
143d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
143e0 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
143f0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
14400 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
14410 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
14420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14430 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
14440 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
14450 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
14460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
14480 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
14490 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
144a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144b0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
144c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
144d0 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
144e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
144f0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
14500 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
14510 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14520 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
14530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14540 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14550 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14560 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
14570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14580 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
14590 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
145a0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
145b0 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
145c0 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
145d0 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
145e0 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
145f0 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
14600 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
14610 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
14620 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
14630 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
14640 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
14650 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
14660 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
14670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14680 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
14690 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
146a0 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
146b0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
146c0 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
146d0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
146e0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
146f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14700 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14710 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
14720 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14730 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
14740 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
14750 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
14760 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
14770 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14780 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14790 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
147a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
147b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
147c0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
147d0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
147e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
147f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14800 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
14810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
14820 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
14830 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
14840 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
14850 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
14860 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
14870 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
14880 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
14890 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
148a0 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
148b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
148c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
148d0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
148e0 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
148f0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
14900 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
14910 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
14920 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
14930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
14940 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
14950 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
14960 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
14970 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
14980 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
14990 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
149a0 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
149b0 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
149c0 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
149d0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
149e0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
149f0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
14a00 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
14a10 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
14a20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14a30 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
14a40 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
14a50 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14a60 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
14a70 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
14a80 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
14a90 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
14aa0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
14ab0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
14ac0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
14ad0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
14ae0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
14af0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
14b00 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
14b10 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
14b20 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
14b30 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
14b40 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
14b50 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
14b60 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
14b70 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
14b80 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
14b90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
14ba0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
14bb0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
14bc0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
14bd0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
14be0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
14bf0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
14c00 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
14c10 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
14c20 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
14c30 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
14c40 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
14c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14c60 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14c70 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14c80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14c90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14ca0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
14cb0 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
14cc0 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
14cd0 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
14ce0 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
14cf0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
14d00 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
14d10 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
14d20 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
14d30 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
14d40 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
14d50 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
14d60 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
14d70 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
14d80 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
14d90 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
14da0 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
14db0 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
14dc0 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
14dd0 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
14de0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
14df0 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
14e00 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
14e10 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
14e20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
14e30 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
14e40 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
14e50 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
14e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14e70 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
14e80 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
14e90 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
14ea0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14eb0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
14ec0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
14ed0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
14ee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ef0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
14f00 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
14f10 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
14f20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
14f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14f40 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
14f50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14f60 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
14f70 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
14f80 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
14f90 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
14fa0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
14fb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14fc0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14fd0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
14fe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14ff0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
15000 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
15010 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
15020 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
15030 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
15040 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
15050 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
15060 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
15070 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
15080 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
15090 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
150a0 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
150b0 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
150c0 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
150d0 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
150e0 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
150f0 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
15100 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
15110 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
15120 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
15130 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
15140 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
15150 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
15160 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
15170 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15180 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
15190 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
151a0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
151b0 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
151c0 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
151d0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
151e0 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
151f0 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
15200 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
15210 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
15220 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
15230 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
15240 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
15250 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
15260 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
15270 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
15280 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
15290 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
152a0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
152b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
152c0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
152d0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
152e0 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
152f0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
15300 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
15310 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
15320 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
15330 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
15340 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
15350 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
15360 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
15370 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
15380 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
15390 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
153a0 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
153b0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
153c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
153d0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
153e0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
153f0 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
15400 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
15410 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
15420 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
15430 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
15440 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
15450 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
15460 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
15470 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
15480 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
15490 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
154a0 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
154b0 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
154c0 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
154d0 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
154e0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
154f0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
15500 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
15510 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
15520 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
15530 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
15540 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
15550 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
15560 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
15570 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
15580 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
15590 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
155a0 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
155b0 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
155c0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
155d0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
155e0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
155f0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
15610 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
15620 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
15630 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
15640 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
15650 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
15660 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
15670 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
15680 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
15690 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
156a0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
156b0 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
156c0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
156d0 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
156e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
156f0 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
15700 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
15710 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
15720 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
15730 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
15740 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
15750 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
15760 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
15770 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
15780 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
15790 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
157a0 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
157b0 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
157c0 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
157d0 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
157e0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
157f0 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
15800 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
15810 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
15820 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
15830 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
15840 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
15850 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
15860 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
15870 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
15880 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
15890 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
158a0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
158b0 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
158c0 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
158d0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
158e0 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
158f0 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
15900 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
15910 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
15920 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
15930 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
15940 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
15950 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
15960 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
15970 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
15980 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
15990 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
159a0 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
159b0 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
159c0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
159d0 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
159e0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
159f0 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
15a00 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
15a10 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
15a20 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
15a30 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
15a40 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
15a50 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
15a60 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
15a70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
15a80 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
15a90 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
15aa0 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
15ab0 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
15ac0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
15ad0 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
15ae0 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
15af0 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
15b00 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
15b10 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
15b20 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
15b30 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
15b40 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
15b50 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
15b60 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
15b70 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
15b80 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
15b90 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
15ba0 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
15bb0 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
15bc0 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
15bd0 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
15be0 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
15bf0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
15c00 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
15c10 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
15c20 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
15c30 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
15c40 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
15c50 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
15c60 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
15c70 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
15c80 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
15c90 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
15ca0 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
15cb0 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
15cc0 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
15cd0 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
15ce0 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
15cf0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
15d00 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
15d10 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
15d20 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
15d30 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
15d40 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
15d50 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
15d60 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
15d70 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
15d80 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
15d90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
15da0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
15db0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15dc0 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
15dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15de0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15df0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15e00 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15e10 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15e20 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15e30 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15e40 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15e50 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15e60 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15e70 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15e80 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
15e90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15ea0 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
15eb0 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
15ec0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
15ed0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
15ee0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
15ef0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15f00 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15f10 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
15f20 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
15f30 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
15f40 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
15f50 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
15f60 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
15f70 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
15f80 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
15f90 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
15fa0 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
15fb0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
15fc0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
15fd0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
15fe0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
15ff0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16000 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
16010 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
16020 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
16030 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
16040 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16050 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
16060 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
16070 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
16080 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16090 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
160a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
160b0 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
160c0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
160d0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
160e0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
160f0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
16100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16110 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
16120 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
16130 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
16140 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
16150 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16160 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
16170 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
16180 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
16190 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
161a0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
161b0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
161c0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
161d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
161e0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
161f0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
16200 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
16210 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20  ddrEofA_noB;    
16220 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64   /* Alternate ad
16230 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75  drEofA if B is u
16240 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a  ninitialized */.
16250 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20    int addrEofB; 
16260 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16270 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
16280 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -B-exhausted sub
16290 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
162a0 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20   addrAltB;      
162b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
162c0 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74   the A<B subrout
162d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
162e0 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f  rAeqB;         /
162f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
16300 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65   A==B subroutine
16310 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67   */.  int addrAg
16320 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
16330 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e  ddress of the A>
16340 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
16350 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b    int regLimitA;
16360 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
16370 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
16380 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
16390 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20  regLimitB;      
163a0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
163b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
163c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
163d0 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  v;          /* A
163e0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
163f0 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76  ers to hold prev
16400 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ious output */. 
16410 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b   int savedLimit;
16420 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
16430 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d  value of p->iLim
16440 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  it */.  int save
16450 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  dOffset;      /*
16460 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
16470 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->iOffset */.  
16480 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20  int labelCmpr;  
16490 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
164a0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
164b0 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  the merge algori
164c0 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  thm */.  int lab
164d0 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  elEnd;         /
164e0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
164f0 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61  end of the overa
16500 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a  ll SELECT stmt *
16510 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
16520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
16530 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  p instructions t
16540 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74  hat get retarget
16550 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ted */.  int op;
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16570 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c  * One of TK_ALL,
16580 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
16590 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45  CEPT, TK_INTERSE
165a0 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  CT */.  KeyInfo 
165b0 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a  *pKeyDup = 0; /*
165c0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
165d0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  rmation for dupl
165e0 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f  icate removal */
165f0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16600 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70  Merge;   /* Comp
16610 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
16620 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72  on for merging r
16630 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
16640 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
16650 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
16660 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
16670 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
16680 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
16690 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
166a0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
166b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
166c0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
166d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
166e0 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
166f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
16700 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59  ng from ORDER BY
16710 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74   terms to result
16720 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   set columns */.
16730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16740 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
16750 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20  t iSub1;        
16760 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
16770 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
16780 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b   */.  int iSub2;
16790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
167a0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
167b0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
167c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
167d0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
167e0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
167f0 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
16800 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
16810 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
16820 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
16830 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
16840 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
16850 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
16860 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
16870 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
16880 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
16890 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
168a0 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
168b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
168c0 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
168d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
168e0 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
168f0 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
16900 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
16910 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
16920 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
16930 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
16940 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
16950 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
16960 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
16970 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
16980 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
16990 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
169a0 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
169b0 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
169c0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
169d0 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
169e0 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
169f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
16a00 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
16a10 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
16a20 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
16a30 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
16a40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16a50 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
16a60 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
16a70 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
16a80 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
16a90 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
16aa0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
16ab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
16ac0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16ad0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
16ae0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
16af0 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
16b00 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
16b10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
16b20 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
16b30 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
16b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
16b50 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
16b60 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
16b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16b80 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
16b90 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
16ba0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
16bb0 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
16bc0 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
16bd0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
16be0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16bf0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16c00 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
16c10 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
16c20 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
16c30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
16c40 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
16c50 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
16c60 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
16c70 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
16c80 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
16c90 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
16ca0 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
16cb0 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
16cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16cd0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
16ce0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
16cf0 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
16d00 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
16d10 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
16d20 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
16d30 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
16d40 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
16d50 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
16d60 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
16d70 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
16d80 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
16d90 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
16da0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
16db0 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
16dc0 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
16dd0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
16de0 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
16df0 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
16e00 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
16e10 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
16e20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
16e30 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
16e40 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
16e50 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
16e60 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  nOrderBy);.  if(
16e70 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
16e80 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16e90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16ea0 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
16eb0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
16ec0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
16ed0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
16ee0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
16ef0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
16f00 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74            && pIt
16f10 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
16f20 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
16f30 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
16f40 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
16f50 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
16f60 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
16f70 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
16f80 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
16f90 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
16fa0 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
16fb0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
16fc0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
16fd0 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
16fe0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
16ff0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
17000 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
17010 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
17020 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
17030 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
17040 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
17050 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
17060 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
17070 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
17080 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
17090 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
170a0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
170b0 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
170c0 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
170d0 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
170e0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
170f0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
17100 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
17110 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
17120 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17130 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
17140 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
17150 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
17160 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
17170 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
17180 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
17190 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
171a0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
171b0 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
171c0 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
171d0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
171e0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
171f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17200 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
17210 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
17220 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
17230 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
17240 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
17250 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
17260 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17270 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17280 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
17290 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
172a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
172b0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
172c0 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
172d0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
172e0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
172f0 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
17300 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
17310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17320 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
17330 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
17340 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
17350 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
17360 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
17370 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
17380 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
17390 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
173a0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
173b0 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
173c0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
173d0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
173e0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
173f0 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
17400 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
17410 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
17420 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
17430 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
17440 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
17450 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17460 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
17470 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
17480 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
17490 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
174a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
174b0 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
174c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
174d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
174e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
174f0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
17500 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
17510 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17530 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
17540 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
17550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17560 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
17570 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
17580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
17590 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
175a0 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
175b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
175c0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
175d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
175e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
175f0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
17600 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
17610 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
17620 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
17630 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
17640 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
17650 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
17660 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17670 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
17680 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
17690 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
176a0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
176b0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
176c0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
176d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
176e0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
176f0 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
17700 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
17710 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
17720 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
17730 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
17740 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
17750 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
17760 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
17770 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64  elect..  */.  ad
17780 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
17790 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
177a0 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
177b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
177c0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
177d0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
177e0 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
177f0 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
17800 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
17810 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
17820 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
17830 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
17840 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
17850 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
17860 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
17870 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17880 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
17890 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
178a0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
178b0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
178c0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
178d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
178e0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
178f0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
17900 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
17910 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
17920 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
17930 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
17940 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
17950 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
17960 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17970 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
17980 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17990 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
179a0 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
179b0 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
179c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
179d0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
179e0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
179f0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
17a00 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
17a10 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
17a20 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
17a30 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
17a40 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
17a50 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
17a60 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
17a70 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
17a80 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17a90 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
17aa0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
17ab0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
17ac0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
17ad0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
17ae0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
17af0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
17b00 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
17b10 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
17b20 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
17b30 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
17b40 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
17b50 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
17b60 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
17b70 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
17b80 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
17b90 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
17ba0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
17bb0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
17bc0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
17bd0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
17be0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
17bf0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
17c00 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
17c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17c20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
17c30 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
17c40 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
17c50 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
17c60 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
17c70 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
17c80 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
17c90 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
17ca0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
17cb0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
17cc0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
17cd0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
17ce0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
17cf0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
17d00 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
17d10 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
17d20 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
17d30 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
17d40 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
17d50 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
17d60 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
17d70 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
17d80 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
17d90 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
17da0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
17db0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
17dc0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
17dd0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
17de0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
17df0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
17e00 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
17e10 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
17e20 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
17e30 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
17e40 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17e50 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
17e60 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
17e70 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
17e80 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
17e90 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
17ea0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
17eb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
17ec0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
17ed0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
17ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ef0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
17f00 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
17f10 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
17f20 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
17f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
17f40 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
17f50 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
17f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17f70 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
17f80 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
17f90 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
17fa0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
17fb0 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  w;.  }..  /* Gen
17fc0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
17fd0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
17fe0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
17ff0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
18000 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
18010 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
18020 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
18030 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
18040 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
18050 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
18060 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
18070 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
18080 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
18090 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
180a0 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
180b0 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
180c0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
180d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
180e0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
180f0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
18100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18110 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
18120 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
18130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
18150 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
18160 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
18170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18180 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
18190 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
181a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
181b0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
181c0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
181d0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
181e0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
181f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
18200 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
18210 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18220 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
18230 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
18240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18250 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
18260 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
18270 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
18280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
18290 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
182a0 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
182b0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
182c0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
182d0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
182e0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
182f0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
18300 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
18310 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
18320 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
18330 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
18340 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
18350 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
18360 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
18370 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
18380 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
18390 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
183a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
183b0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
183c0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
183d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183e0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
183f0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
18400 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
18410 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
18420 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
18430 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
18440 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
18450 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
18460 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
18470 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18480 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
18490 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
184a0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
184b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
184c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
184d0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
184e0 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
184f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18500 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
18510 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  rB, addrEofB);. 
18520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18530 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18540 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
18550 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
18560 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
18570 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
18580 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
18590 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
185a0 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
185b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
185c0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
185d0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 0a 20  addrEofA_noB);. 
185e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
185f0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
18600 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
18610 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
18620 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
18630 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
18640 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18650 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
18660 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
18670 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
18680 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
18690 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
186a0 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
186b0 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
186c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
186d0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
186e0 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
186f0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
18720 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
18730 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
18740 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
18750 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
18760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18770 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
18780 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
18790 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
187a0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
187b0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
187c0 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
187d0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
187e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
187f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
18800 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
18810 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
18820 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
18830 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
18840 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
18850 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
18860 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
18870 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
18880 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
18890 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
188a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
188b0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
188c0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
188d0 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
188e0 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
188f0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
18900 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
18910 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
18920 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
18930 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
18940 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
18950 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
18960 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
18970 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
18980 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
18990 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
189a0 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
189b0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
189c0 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
189d0 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
189e0 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
189f0 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
18a00 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
18a10 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
18a20 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
18a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18a40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
18a50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18a60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
18a70 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
18a80 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
18a90 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
18aa0 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
18ab0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
18ac0 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
18ad0 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
18ae0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
18af0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
18b00 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
18b10 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
18b20 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
18b30 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
18b40 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
18b50 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
18b60 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
18b70 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
18b80 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
18b90 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
18ba0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
18bb0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
18bc0 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
18bd0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
18be0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
18bf0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
18c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18c10 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
18c20 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
18c30 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
18c40 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
18c50 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
18c60 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
18c70 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
18c80 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
18c90 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
18ca0 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
18cb0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
18cc0 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
18cd0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
18ce0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
18cf0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
18d00 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
18d10 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
18d20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
18d30 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
18d40 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
18d50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
18d60 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
18d70 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
18d80 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
18d90 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
18da0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
18db0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
18dc0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
18dd0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
18de0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
18df0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
18e00 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
18e10 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
18e20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
18e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
18e40 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
18e50 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
18e60 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
18e70 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
18e80 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
18e90 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
18ea0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
18eb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
18ec0 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
18ed0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
18ee0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
18ef0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
18f00 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
18f10 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
18f20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
18f30 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
18f40 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
18f50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
18f60 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
18f70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
18f80 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
18f90 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
18fa0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
18fb0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
18fc0 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
18fd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
18fe0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
18ff0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19000 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
19010 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
19020 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19030 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
19040 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
19050 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
19060 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
19070 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
19080 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19090 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
190a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
190b0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
190c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
190d0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
190e0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
190f0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
19100 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
19110 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
19120 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
19130 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
19140 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
19150 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
19160 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19170 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
19180 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
19190 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
191a0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
191b0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
191c0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
191d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
191e0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
191f0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
19200 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
19210 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
19220 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
19230 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
19240 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
19250 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
19260 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
19270 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
19280 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
19290 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
192a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
192b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
192c0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
192d0 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
192e0 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
192f0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
19300 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
19310 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
19320 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
19330 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19340 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
19350 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
19360 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
19370 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
19380 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
19390 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
193a0 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
193b0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
193c0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
193d0 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
193e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
193f0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
19400 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
19410 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
19420 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
19430 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19440 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
19450 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
19460 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
19470 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
19480 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
19490 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
194a0 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
194b0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
194c0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
194d0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
194e0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
194f0 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
19500 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
19510 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
19520 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
19530 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
19540 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
19550 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
19560 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
19570 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
19580 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
19590 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
195a0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
195b0 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
195c0 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
195d0 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
195e0 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
195f0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
19600 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
19610 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
19620 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
19630 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
19640 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
19650 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
19660 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
19670 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
19680 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
19690 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
196a0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
196b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
196c0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
196d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
196e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
196f0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19700 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19710 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19720 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
19730 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
19740 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
19750 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
19760 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
19770 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
19780 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
19790 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
197a0 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
197b0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
197c0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
197d0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
197e0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
197f0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
19800 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
19810 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
19820 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
19830 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
19840 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
19850 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
19860 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
19870 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
19880 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
19890 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
198a0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
198b0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
198c0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
198d0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
198e0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
198f0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
19900 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
19910 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
19920 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
19930 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
19940 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
19950 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
19960 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
19970 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
19980 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
19990 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
199a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
199b0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
199c0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
199d0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
199e0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
199f0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
19a00 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
19a10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
19a20 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
19a30 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
19a40 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
19a50 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
19a60 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
19a70 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
19a80 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
19a90 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
19aa0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
19ab0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
19ac0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
19ad0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
19ae0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
19af0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
19b00 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
19b10 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
19b20 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
19b30 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
19b40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19b50 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
19b60 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
19b70 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
19b80 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
19b90 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
19ba0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
19bb0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
19bc0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
19bd0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
19be0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
19bf0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
19c00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
19c10 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
19c20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
19c30 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
19c40 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
19c50 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
19c60 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
19c70 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
19c80 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
19c90 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
19ca0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
19cb0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
19cc0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
19cd0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
19ce0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
19cf0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
19d00 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
19d10 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
19d20 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
19d30 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
19d40 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
19d50 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
19d60 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
19d70 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
19d80 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
19d90 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
19da0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
19db0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
19dc0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
19dd0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
19de0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
19df0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
19e00 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
19e10 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
19e20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
19e30 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
19e40 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
19e50 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
19e60 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
19e70 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
19e80 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
19e90 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
19ea0 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
19eb0 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
19ec0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
19ed0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
19ee0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
19ef0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
19f00 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
19f10 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
19f20 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
19f30 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
19f40 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
19f50 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
19f60 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
19f70 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
19f80 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
19f90 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
19fa0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
19fb0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
19fc0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
19fd0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
19fe0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
19ff0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1a000 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1a010 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1a020 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1a030 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1a040 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1a050 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1a060 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1a070 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1a080 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1a090 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1a0a0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1a0b0 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1a0c0 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1a0d0 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1a0e0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1a0f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1a100 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1a110 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1a120 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1a130 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1a140 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1a150 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1a160 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1a170 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a180 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1a190 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1a1a0 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1a1b0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1a1c0 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1a1d0 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1a1e0 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1a1f0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1a200 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1a210 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1a220 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1a230 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1a240 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1a250 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1a260 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1a270 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1a280 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1a290 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1a2a0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1a2b0 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1a2c0 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1a2d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1a2e0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1a2f0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1a300 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1a310 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1a320 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1a330 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1a340 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1a350 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1a360 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1a370 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1a380 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1a390 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1a3a0 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1a3b0 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1a3c0 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1a3d0 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1a3e0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1a3f0 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1a400 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1a410 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1a420 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1a430 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1a440 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1a450 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1a460 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1a470 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1a480 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1a490 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1a4a0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1a4b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1a4c0 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1a4d0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1a4e0 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1a4f0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1a500 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1a510 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1a520 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1a530 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1a540 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1a550 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1a560 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1a570 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1a580 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1a590 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1a5a0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1a5b0 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1a5c0 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1a5d0 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1a5e0 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1a5f0 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1a600 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1a610 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1a620 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1a630 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1a640 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1a650 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1a660 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1a670 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1a680 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1a690 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1a6a0 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1a6b0 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1a6c0 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1a6d0 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1a6e0 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1a6f0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1a700 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1a710 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1a720 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1a730 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1a740 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1a750 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1a760 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1a770 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1a780 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1a790 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1a7a0 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1a7b0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1a7c0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1a7d0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1a7e0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1a7f0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1a800 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1a810 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1a820 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1a830 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1a840 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1a850 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1a860 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1a870 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1a880 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1a890 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1a8a0 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1a8b0 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1a8c0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1a8d0 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1a8e0 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1a8f0 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1a900 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1a910 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a920 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1a930 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1a940 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1a950 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1a960 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1a970 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1a980 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1a990 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1a9a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1a9b0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1a9c0 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1a9d0 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1a9e0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1a9f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1aa00 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1aa10 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1aa20 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1aa30 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1aa40 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1aa50 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1aa60 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1aa70 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1aa80 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1aa90 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1aaa0 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1aab0 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1aac0 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1aad0 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1aae0 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1aaf0 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1ab00 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1ab10 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a  elect()..**.**.*
1ab20 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
1ab30 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
1ab40 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
1ab50 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
1ab60 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
1ab70 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
1ab80 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
1ab90 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1aba0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
1abb0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1abc0 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
1abd0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1abe0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1abf0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1ac00 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1ac10 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
1ac20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1ac30 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
1ac40 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
1ac50 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
1ac60 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
1ac70 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
1ac80 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
1ac90 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
1aca0 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
1acb0 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
1acc0 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
1acd0 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
1ace0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
1acf0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
1ad00 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
1ad10 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
1ad20 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
1ad30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ad40 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ad50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1ad60 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
1ad70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1ad80 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1ad90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1ada0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
1adb0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
1adc0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
1add0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
1ade0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
1adf0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
1ae00 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1ae10 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
1ae20 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
1ae30 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
1ae40 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1ae50 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1ae60 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1ae70 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
1ae80 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
1ae90 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
1aea0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
1aeb0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1aec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1aed0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1aee0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1aef0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1af00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1af10 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1af20 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1af30 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1af40 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1af50 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1af60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1af70 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1af80 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1af90 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1afa0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1afb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
1afc0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1afd0 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
1afe0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
1aff0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1b000 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1b010 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1b020 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1b030 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1b040 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b050 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b060 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1b070 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1b080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b090 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1b0a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b0b0 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1b0c0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1b0d0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1b0e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1b0f0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1b100 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1b110 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1b120 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1b130 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1b140 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1b150 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1b160 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
1b170 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
1b180 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
1b190 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1b1a0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1b1b0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
1b1c0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
1b1d0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1b1e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1b1f0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
1b200 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
1b210 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
1b220 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
1b230 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1b240 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1b250 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
1b260 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
1b270 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
1b280 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
1b290 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1b2a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b2c0 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
1b2d0 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
1b2e0 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
1b2f0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1b300 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1b310 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
1b320 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
1b330 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
1b340 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
1b350 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
1b360 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
1b370 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1b380 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
1b390 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
1b3a0 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
1b3b0 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
1b3c0 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1b3d0 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1b3e0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1b3f0 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1b400 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1b410 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1b420 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1b430 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1b440 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1b450 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1b460 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1b470 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1b480 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1b490 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1b4a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1b4b0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1b4c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1b4d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1b4e0 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1b4f0 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1b500 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1b530 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1b540 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
1b550 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1b560 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b5a0 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
1b5b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
1b5c0 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
1b5d0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
1b600 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1b610 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1b620 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1b630 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1b640 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   Restriction (5)
1b650 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1b660 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
1b670 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
1b680 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
1b690 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1b6a0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
1b6b0 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
1b6c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1b6d0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1b6e0 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
1b6f0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1b700 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1b710 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
1b720 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
1b730 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
1b740 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1b750 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b790 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
1b7a0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
1b7b0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1b7c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b7e0 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
1b7f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1b800 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
1b810 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1b820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b830 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
1b840 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1b850 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  mit && (p->selFl
1b860 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1b870 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  t)!=0 ){.     re
1b880 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1b890 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b8a0 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  21) */.  }.  if(
1b8b0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1b8c0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1b8d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b8e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1b8f0 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20 69 66  on (22)  */.  if
1b900 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1b910 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26   SF_Recursive) &
1b920 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
1b930 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b940 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a 20 20   /* (23)  */..  
1b950 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  /* OBSOLETE COMM
1b960 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 1:.  ** Rest
1b970 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
1b980 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1b990 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
1b9a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1b9b0 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
1b9c0 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
1b9d0 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
1b9e0 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
1b9f0 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
1ba00 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
1ba10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ba20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1ba30 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
1ba40 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
1ba50 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1ba60 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1ba70 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1ba80 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1ba90 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
1baa0 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
1bab0 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
1bac0 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
1bad0 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42  ng..  **.  ** OB
1bae0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32  SOLETE COMMENT 2
1baf0 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1bb00 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
1bb10 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1bb20 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1bb30 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
1bb40 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
1bb50 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
1bb60 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
1bb70 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
1bb80 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1bb90 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
1bba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1bbb0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
1bbc0 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
1bbd0 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
1bbe0 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
1bbf0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1bc00 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1bc10 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1bc20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1bc30 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1bc40 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
1bc50 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
1bc60 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
1bc70 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
1bc80 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
1bc90 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
1bca0 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
1bcb0 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
1bcc0 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
1bcd0 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48  IN..  **.  ** TH
1bce0 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53  IS OVERRIDES OBS
1bcf0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31  OLETE COMMENTS 1
1bd00 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20   AND 2 ABOVE:.  
1bd10 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20  ** Ticket #3300 
1bd20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74  shows that flatt
1bd30 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20  ening the right 
1bd40 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
1bd50 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75  OIN.  ** is frau
1bd60 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e  ght with danger.
1bd70 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20    Best to avoid 
1bd80 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e  the whole thing.
1bd90 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75    If the.  ** su
1bda0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
1bdb0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1bdc0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f  FT JOIN, then do
1bdd0 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20   not flatten..  
1bde0 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
1bdf0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
1be00 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
1be10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1be20 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
1be30 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75  on 17: If the su
1be40 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1be50 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
1be60 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
1be70 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
1be80 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
1be90 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
1bea0 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
1beb0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
1bec0 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
1bed0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
1bee0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
1bef0 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
1bf00 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
1bf10 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
1bf20 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1bf30 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1bf40 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65  erBy ){.      re
1bf50 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74  turn 0;  /* Rest
1bf60 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20  riction 20 */.  
1bf70 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67    }.    if( isAg
1bf80 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
1bf90 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1bfa0 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
1bfb0 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
1bfc0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1bfd0 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
1bfe0 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
1bff0 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
1c000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1c010 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1c020 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1c030 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1c040 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
1c050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1c060 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1c070 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1c080 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1c090 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
1c0a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c0b0 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ->pSrc!=0 );.   
1c0c0 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
1c0d0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1c0e0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1c0f0 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ate))!=0.       
1c100 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
1c110 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
1c120 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20  TK_ALL) .       
1c130 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  || pSub1->pSrc->
1c140 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c  nSrc<1.       ||
1c150 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
1c160 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr!=pSub1->pEL
1c170 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ist->nExpr.     
1c180 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1c190 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1c1a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1c1b0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ub1->pSrc->nSrc>
1c1c0 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1 );.    }..    
1c1d0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1c1e0 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  8. */.    if( p-
1c1f0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1c200 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1c210 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
1c220 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1c230 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1c240 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1c250 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64  ->a[ii].u.x.iOrd
1c260 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74  erByCol==0 ) ret
1c270 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1c280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
1c290 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
1c2a0 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
1c2b0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1c2c0 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a  ed. *****/..  /*
1c2d0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1c2e0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1c2f0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1c300 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1c310 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1c320 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1c330 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c340 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1c350 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1c360 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1c370 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1c380 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1c390 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1c3a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1c3b0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1c3c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1c3d0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1c3e0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1c3f0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1c400 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1c410 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1c420 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1c430 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1c440 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1c450 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1c460 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1c470 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1c480 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1c490 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1c4a0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1c4b0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1c4c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1c4d0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1c4e0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1c4f0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1c500 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1c510 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1c520 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1c530 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1c540 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1c550 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1c560 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1c570 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1c580 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1c590 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1c5a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1c5b0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1c5c0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1c5d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1c5e0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1c5f0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1c600 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1c610 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1c620 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1c630 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1c640 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1c650 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1c660 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1c670 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1c680 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1c690 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1c6a0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1c6b0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1c6c0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1c6d0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1c6e0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1c6f0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1c700 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1c710 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1c720 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1c730 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1c740 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1c750 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1c760 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1c770 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1c780 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1c790 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1c7a0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1c7b0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1c7c0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1c7d0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1c7e0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1c7f0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1c800 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1c810 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1c820 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1c830 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1c840 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1c850 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1c860 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1c870 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1c880 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1c890 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1c8a0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1c8b0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1c8c0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1c8d0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1c8e0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1c8f0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1c900 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1c910 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1c920 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1c930 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1c940 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1c950 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1c960 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1c970 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1c980 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1c990 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1c9a0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1c9b0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e   TK_ALL;.    p->
1c9c0 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
1c9d0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1c9e0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
1c9f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
1ca00 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
1ca10 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1ca20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
1ca30 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
1ca40 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  }.    p->pPrior 
1ca50 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  = pNew;.    if( 
1ca60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ca70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1ca80 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
1ca90 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
1caa0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
1cab0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
1cac0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
1cad0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1cae0 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
1caf0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1cb00 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
1cb10 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
1cb20 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
1cb30 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
1cb40 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
1cb50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
1cb60 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1cb70 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
1cb80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1cb90 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1cba0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1cbb0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1cbc0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
1cbd0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
1cbe0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1cbf0 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
1cc00 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
1cc10 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1cc20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
1cc30 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
1cc40 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
1cc50 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1cc60 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1cc70 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
1cc80 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
1cc90 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
1cca0 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
1ccb0 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
1ccc0 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
1ccd0 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
1cce0 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
1ccf0 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
1cd00 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
1cd10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
1cd20 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
1cd30 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
1cd40 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
1cd50 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
1cd60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
1cd70 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
1cd80 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
1cd90 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
1cda0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
1cdb0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
1cdc0 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a  Del->nRef==1 ){.
1cdd0 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f        Parse *pTo
1cde0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1cdf0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1ce00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61  arse);.      pTa
1ce10 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
1ce20 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  bie = pToplevel-
1ce30 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20  >pZombieTab;.   
1ce40 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a     pToplevel->pZ
1ce50 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
1ce60 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
1ce70 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1ce80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a  ->nRef--;.    }.
1ce90 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
1cea0 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ab = 0;.  }..  /
1ceb0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1cec0 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
1ced0 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
1cee0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1cef0 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e  ery.  ** flatten
1cf00 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65  ing (as describe
1cf10 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65  d above).  If we
1cf20 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66   are doing a dif
1cf30 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a  ferent kind.  **
1cf40 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d   of flattening -
1cf50 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74   a flattening ot
1cf60 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f  her than a compo
1cf70 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
1cf80 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74  ttening -.  ** t
1cf90 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e  hen this loop on
1cfa0 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20  ly runs once..  
1cfb0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
1cfc0 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74  p moves all of t
1cfd0 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
1cfe0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1cff0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
1d000 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d010 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d020 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
1d030 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
1d040 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
1d050 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
1d060 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
1d070 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
1d080 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
1d090 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
1d0a0 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
1d0b0 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
1d0c0 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
1d0d0 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
1d0e0 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
1d0f0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
1d100 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
1d110 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
1d120 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
1d130 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
1d140 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
1d150 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
1d160 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
1d170 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
1d180 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e   */.  for(pParen
1d190 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50  t=p; pParent; pP
1d1a0 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70  arent=pParent->p
1d1b0 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62  Prior, pSub=pSub
1d1c0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
1d1d0 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20  nt nSubSrc;.    
1d1e0 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  u8 jointype = 0;
1d1f0 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70  .    pSubSrc = p
1d200 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  Sub->pSrc;     /
1d210 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1d220 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
1d230 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
1d240 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75  rc->nSrc;  /* Nu
1d250 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
1d260 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63   subquery FROM c
1d270 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72  lause */.    pSr
1d280 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
1d290 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1d2a0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1d2b0 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20  er query */..   
1d2c0 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
1d2d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1d2e0 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72  nt==p );  /* Fir
1d2f0 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20  st time through 
1d300 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
1d310 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
1d320 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
1d330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d340 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1d350 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
1d360 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
1d370 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
1d380 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
1d390 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1d3a0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1d3b0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
1d3c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1d3d0 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
1d3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1d3f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1d400 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d420 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
1d430 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
1d440 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
1d450 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d460 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
1d470 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
1d480 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
1d490 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
1d4a0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1d4b0 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
1d4c0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1d4d0 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
1d4e0 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
1d4f0 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
1d500 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1d510 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
1d520 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1d530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1d540 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1d550 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
1d560 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
1d570 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
1d580 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
1d590 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
1d5a0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1d5b0 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
1d5c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
1d5d0 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
1d5e0 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
1d5f0 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
1d600 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
1d610 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
1d620 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
1d630 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20  he out query to 
1d640 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69  4 slots.  The mi
1d650 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  ddle.    ** slot
1d660 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20   is expanded to 
1d670 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64  two slots in ord
1d680 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  er to make space
1d690 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
1d6a0 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1d6b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d6c0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1d6d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d6e0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
1d6f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1d700 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   = pSrc = sqlite
1d710 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1d720 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72  db, pSrc, nSubSr
1d730 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20  c-1,iFrom+1);.  
1d740 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1d750 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1d760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d770 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d780 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52   Transfer the FR
1d790 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
1d7a0 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
1d7b0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  y into the.    *
1d7c0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  * outer query.. 
1d7d0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
1d7e0 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
1d7f0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1d800 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1d810 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  , pSrc->a[i+iFro
1d820 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m].pUsing);.    
1d830 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
1d840 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
1d850 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
1d860 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
1d870 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
1d880 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
1d890 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
1d8a0 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  rom].jointype = 
1d8b0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20  jointype;.  .   
1d8c0 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
1d8d0 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
1d8e0 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
1d8f0 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
1d900 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
1d910 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
1d920 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1d930 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ery..    ** .   
1d940 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1d950 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
1d960 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
1d970 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
1d980 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
1d990 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
1d9a0 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20  b;.    **   \   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1d9d0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
1d9e0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
1d9f0 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f  .    **    \____
1da00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1da10 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
1da20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1da30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
1da40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c    **.    ** We l
1da50 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
1da60 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
1da70 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
1da80 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1da90 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20  e.    ** "a" we 
1daa0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
1dab0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1dac0 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
1dad0 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
1dae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69  ..    */.    pLi
1daf0 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45  st = pParent->pE
1db00 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
1db10 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1db20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
1db30 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
1db40 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1db50 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1db60 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1db70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
1db80 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
1db90 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
1dba0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1dbb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1dbc0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
1dbd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62   }.    }.    sub
1dbe0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1dbf0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20  Parent->pEList, 
1dc00 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1dc10 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
1dc20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73  isAgg ){.      s
1dc30 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1dc40 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1dc50 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
1dc60 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1dc70 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1dc80 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
1dc90 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1dca0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
1dcb0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1dcc0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
1dcd0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1dce0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1dcf0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
1dd00 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1dd10 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
1dd20 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
1dd30 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
1dd40 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 0;.    }else
1dd50 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f   if( pParent->pO
1dd60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1dd70 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1dd80 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  , pParent->pOrde
1dd90 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
1dda0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1ddb0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
1ddc0 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  >pWhere ){.     
1ddd0 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
1dde0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
1ddf0 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
1de00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1de10 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
1de20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65  }.    if( subque
1de30 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1de40 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1de50 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
1de60 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1de70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74  Having = pParent
1de80 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
1de90 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1dea0 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
1deb0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1dec0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1ded0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1dee0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1def0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1df00 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1df10 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
1df20 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
1df30 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1df60 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1df70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29  Sub->pHaving, 0)
1df80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1df90 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1dfa0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1dfb0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1dfc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1dfd0 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
1dfe0 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
1dff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e000 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1e010 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1e020 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
1e030 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1e040 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1e050 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1e060 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1e070 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1e080 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
1e090 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
1e0a0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
1e0b0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
1e0c0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
1e0d0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
1e0e0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
1e0f0 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
1e100 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
1e110 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
1e120 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e130 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
1e140 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
1e150 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
1e160 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
1e170 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
1e180 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
1e190 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
1e1a0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
1e1b0 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
1e1c0 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
1e1d0 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
1e1e0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
1e1f0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
1e200 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
1e210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
1e220 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1e230 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
1e240 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
1e250 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
1e260 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
1e270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
1e280 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
1e290 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
1e2a0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
1e2b0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
1e2c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e2d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1e2e0 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75   pSub1);..  retu
1e2f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
1e300 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1e310 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1e320 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1e330 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1e340 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
1e350 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1e360 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
1e370 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1e380 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
1e390 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
1e3a0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
1e3b0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
1e3c0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1e3d0 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
1e3e0 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
1e3f0 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
1e400 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
1e410 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
1e420 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
1e430 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
1e440 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
1e450 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1e460 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
1e470 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
1e480 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
1e490 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
1e4a0 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
1e4b0 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
1e4c0 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
1e4d0 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
1e4e0 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
1e4f0 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
1e500 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
1e510 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1e520 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
1e530 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
1e540 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
1e550 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1e560 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
1e570 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
1e580 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
1e590 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
1e5a0 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
1e5b0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1e5c0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
1e5d0 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
1e5e0 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
1e5f0 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
1e600 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
1e610 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
1e620 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1e630 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
1e640 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1e650 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
1e660 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
1e670 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
1e680 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e690 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1e6a0 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
1e6b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1e6c0 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
1e6d0 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
1e6e0 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
1e6f0 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
1e700 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
1e710 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e720 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
1e730 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
1e740 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
1e750 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
1e760 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1e770 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
1e780 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
1e790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
1e7a0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1e7b0 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
1e7c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
1e7d0 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
1e7e0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
1e7f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1e800 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
1e810 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
1e820 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1e830 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
1e840 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
1e850 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
1e860 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1e870 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
1e880 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
1e890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e8a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
1e8b0 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
1e8c0 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
1e8d0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
1e8e0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
1e8f0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
1e900 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
1e910 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1e920 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1e930 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
1e940 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20  cond argment is 
1e950 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
1e960 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
1e970 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
1e980 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
1e990 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
1e9a0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
1e9b0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
1e9c0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
1e9d0 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
1e9e0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
1e9f0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
1ea00 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
1ea10 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
1ea20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
1ea30 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
1ea40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
1ea50 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
1ea60 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
1ea70 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
1ea80 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
1ea90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1eaa0 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
1eab0 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
1eac0 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
1ead0 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
1eae0 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
1eaf0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
1eb00 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
1eb10 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1eb20 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
1eb30 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
1eb40 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
1eb50 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
1eb60 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
1eb70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1eb80 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
1eb90 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
1eba0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
1ebb0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1ebc0 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
1ebd0 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
1ebe0 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
1ebf0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
1ec00 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1ec10 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1ec20 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1ec30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1ec40 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
1ec50 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
1ec60 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
1ec70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
1ec80 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
1ec90 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
1eca0 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
1ecb0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1ecc0 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
1ecd0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
1ece0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
1ecf0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
1ed00 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
1ed10 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
1ed20 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
1ed30 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
1ed40 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1ed50 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
1ed60 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
1ed70 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
1ed80 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
1ed90 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
1eda0 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
1edb0 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
1edc0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
1edd0 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
1ede0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
1edf0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
1ee00 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
1ee10 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
1ee20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1ee30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1ee40 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
1ee50 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
1ee60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ee70 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
1ee80 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
1ee90 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20  rom->zIndex ){. 
1eea0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1eeb0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
1eec0 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d    char *zIndex =
1eed0 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a   pFrom->zIndex;.
1eee0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1eef0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1ef00 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
1ef10 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
1ef20 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
1ef30 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29  ->zName, zIndex)
1ef40 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
1ef50 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
1ef60 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
1ef70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ef80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ef90 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1efa0 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30  : %s", zIndex, 0
1efb0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
1efc0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
1efd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1efe0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1eff0 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
1f000 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
1f010 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f020 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
1f030 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
1f040 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
1f050 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
1f060 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
1f070 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
1f080 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
1f090 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
1f0a0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1f0b0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
1f0c0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
1f0d0 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
1f0e0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
1f0f0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
1f100 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
1f110 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1f120 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
1f130 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
1f140 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1f150 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
1f160 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
1f170 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
1f180 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
1f190 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
1f1a0 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
1f1b0 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
1f1c0 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
1f1d0 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
1f1e0 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
1f1f0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
1f200 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1f210 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
1f220 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
1f230 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
1f240 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
1f250 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
1f260 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1f270 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
1f280 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
1f290 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
1f2a0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
1f2b0 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
1f2c0 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
1f2d0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
1f2e0 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
1f2f0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
1f300 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
1f310 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
1f320 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
1f330 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
1f340 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
1f350 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
1f360 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
1f370 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1f380 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
1f390 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
1f3a0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
1f3b0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
1f3c0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
1f3d0 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
1f3e0 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
1f3f0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
1f400 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
1f410 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
1f420 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
1f430 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
1f440 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
1f450 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
1f460 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
1f470 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1f480 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1f490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1f4a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
1f4b0 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
1f4c0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
1f4d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
1f4e0 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
1f4f0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
1f500 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
1f510 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
1f520 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
1f530 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
1f540 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
1f550 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
1f560 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
1f570 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1f580 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1f590 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
1f5a0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
1f5b0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
1f5c0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
1f5d0 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
1f5e0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
1f5f0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
1f600 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1f610 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
1f620 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
1f630 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1f640 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1f650 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
1f660 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1f670 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
1f680 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
1f690 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
1f6a0 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
1f6b0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1f6c0 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
1f6d0 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
1f6e0 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
1f6f0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
1f700 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1f710 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
1f720 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
1f730 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
1f740 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1f750 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
1f760 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1f770 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70  TK_ALL, 0));.  p
1f780 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1f790 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
1f7a0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
1f7b0 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
1f7c0 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
1f7d0 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1f7e0 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
1f7f0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
1f800 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
1f810 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
1f820 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1f830 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nue;.}..#ifndef 
1f840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
1f850 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
1f860 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
1f870 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
1f880 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
1f890 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
1f8a0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
1f8b0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
1f8c0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
1f8d0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
1f8e0 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
1f8f0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
1f900 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
1f910 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
1f920 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
1f930 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
1f940 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
1f950 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
1f960 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
1f970 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
1f980 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
1f990 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
1f9a0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
1f9b0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
1f9c0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
1f9d0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
1f9e0 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
1f9f0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
1fa00 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
1fa10 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
1fa20 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa40 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d  * Current outerm
1fa50 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
1fa60 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1fa70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
1fa80 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1fa90 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
1faa0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
1fab0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1fad0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
1fae0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
1faf0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
1fb00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1fb10 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
1fb20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
1fb30 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
1fb40 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
1fb50 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
1fb60 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
1fb70 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
1fb80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
1fb90 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
1fba0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
1fbb0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1fbc0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
1fbd0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
1fbe0 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
1fbf0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
1fc00 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
1fc10 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
1fc20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fc30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1fc40 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
1fc50 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
1fc60 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
1fc70 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
1fc80 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
1fc90 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
1fca0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
1fcb0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
1fcc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fcd0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
1fce0 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
1fcf0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1fd00 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
1fd10 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
1fd20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
1fd30 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
1fd40 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
1fd50 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
1fd60 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
1fd70 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
1fd80 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
1fd90 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
1fda0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
1fdb0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
1fdc0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
1fdd0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
1fde0 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
1fdf0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1fe00 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
1fe10 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
1fe20 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
1fe30 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
1fe40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fe50 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
1fe60 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
1fe70 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
1fe80 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
1fe90 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57  =0 || pParse->pW
1fea0 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ith==0 );.  if( 
1feb0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69  pWith ){.    pWi
1fec0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
1fed0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
1fee0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
1fef0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
1ff00 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62  e->bFreeWith = b
1ff10 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Free;.  }.}../*.
1ff20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ff30 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
1ff40 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
1ff50 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
1ff60 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
1ff70 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
1ff80 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
1ff90 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
1ffa0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
1ffb0 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
1ffc0 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
1ffd0 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
1ffe0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
1fff0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
20000 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
20010 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
20020 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
20030 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
20040 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
20050 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
20060 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
20070 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
20080 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
20090 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
200a0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
200b0 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
200c0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
200d0 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
200e0 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
200f0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
20100 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
20110 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
20120 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
20130 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
20140 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
20150 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
20160 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
20170 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
20180 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
20190 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
201a0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
201b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
201c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
201d0 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
201e0 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
201f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20200 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
20210 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
20220 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
20230 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20240 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
20250 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20270 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
20280 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
20290 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
202a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
202b0 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
202c0 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
202d0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
202e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
202f0 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
20300 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
20310 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
20320 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
20330 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
20340 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
20350 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
20360 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
20370 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
20380 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
20390 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
203a0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
203b0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
203c0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
203d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
203e0 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
203f0 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
20400 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
20410 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
20420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
20430 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
20440 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
20450 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
20460 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  zErr is non-NULL
20470 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
20480 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
20490 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
204a0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
204b0 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
204c0 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
204d0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
204e0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
204f0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  . If pCte->zErr 
20500 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
20510 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
20520 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
20530 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
20540 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
20550 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
20560 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >zErr ){.      s
20570 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20580 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72  Parse, pCte->zEr
20590 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  r, pCte->zName);
205a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
205b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
205c0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
205d0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
205e0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
205f0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
20600 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
20610 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
20620 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
20630 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
20640 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
20650 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
20660 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
20670 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
20680 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
20690 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
206a0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
206b0 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b  owEst = 1048576;
206c0 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
206d0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
206e0 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  ral;.    pFrom->
206f0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
20700 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
20710 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
20720 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
20730 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
20740 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
20760 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
20770 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
20780 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
20790 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
207a0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
207b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
207c0 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
207d0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
207e0 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
207f0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
20800 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
20810 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
20820 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
20830 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
20840 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
20850 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
20860 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
20870 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
20880 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
20890 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
208a0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
208b0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
208c0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
208d0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
208e0 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
208f0 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
20900 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
20910 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
20920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
20930 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
20940 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
20950 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  ->isRecursive = 
20960 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
20970 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
20980 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
20990 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
209a0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
209b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
209c0 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
209d0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
209e0 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
209f0 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
20a00 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  ->nRef>2 ){.    
20a10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20a20 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
20a30 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
20a40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
20a50 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
20a60 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
20a70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
20a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20a90 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
20aa0 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ert( pTab->nRef=
20ab0 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
20ac0 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
20ad0 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52  ive) && pTab->nR
20ae0 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
20af0 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72  Cte->zErr = "cir
20b00 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
20b10 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
20b20 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
20b30 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
20b40 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
20b50 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
20b60 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
20b70 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20  bMayRecursive ? 
20b80 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70  pSel->pPrior : p
20b90 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Sel);..    for(p
20ba0 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74  Left=pSel; pLeft
20bb0 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d  ->pPrior; pLeft=
20bc0 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a  pLeft->pPrior);.
20bd0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65      pEList = pLe
20be0 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ft->pEList;.    
20bf0 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20  if( pCte->pCols 
20c00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
20c10 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
20c20 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
20c30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20c40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20c50 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
20c60 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
20c70 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
20c80 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
20c90 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
20ca0 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
20cb0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
20cc0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
20cd0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
20ce0 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
20cf0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20d10 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
20d20 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
20d30 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
20d40 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
20d50 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
20d60 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
20d70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
20d80 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
20d90 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
20da0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
20db0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
20dc0 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
20dd0 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
20de0 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
20df0 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
20e00 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
20e10 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
20e20 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
20e30 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
20e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20e50 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
20e60 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
20e70 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
20e80 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
20e90 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
20ea0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
20eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20ec0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
20ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20ee0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
20ef0 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
20f00 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
20f10 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
20f20 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
20f30 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
20f40 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
20f50 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
20f60 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
20f70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
20f80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
20f90 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
20fa0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
20fb0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
20fc0 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
20fd0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
20fe0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
20ff0 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
21000 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
21010 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
21020 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
21030 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
21040 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
21050 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
21060 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
21070 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
21080 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20  .  if( p->pWith 
21090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
210a0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 2d  Parse->pWith==p-
210b0 3e 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50  >pWith );.    pP
210c0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 2d  arse->pWith = p-
210d0 3e 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a  >pWith->pOuter;.
210e0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
210f0 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
21100 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
21110 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21120 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
21130 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
21140 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
21150 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
21160 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
21170 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
21180 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
21190 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
211a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
211b0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
211c0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
211d0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
211e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
211f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
21200 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
21210 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
21220 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
21230 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
21240 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
21250 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
21260 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
21270 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
21280 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
21290 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
212a0 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
212b0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
212c0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
212d0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
212e0 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
212f0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
21300 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
21310 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
21320 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
21330 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
21340 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
21350 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
21360 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
21370 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
21380 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
21390 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
213a0 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
213b0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
213c0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
213d0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
213e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
213f0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
21400 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
21410 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
21420 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
21430 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
21440 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
21450 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
21460 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
21470 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
21480 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
21490 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
214a0 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
214b0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
214c0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
214d0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
214e0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
214f0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
21500 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
21510 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
21520 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
21530 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
21540 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
21550 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
21560 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
21570 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
21580 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
21590 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
215a0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
215b0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
215c0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
215d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
215e0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
215f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21600 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
21610 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
21620 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
21630 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
21640 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
21650 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
21660 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
21670 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
21680 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
21690 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
216a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
216b0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
216c0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
216d0 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
216e0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
216f0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
21700 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
21710 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
21720 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
21730 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
21740 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
21750 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a   p->pWith, 0);..
21760 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
21770 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
21780 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
21790 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
217a0 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
217b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
217c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
217d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
217e0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
217f0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
21800 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
21810 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
21820 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
21830 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21840 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
21850 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
21860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
21870 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
21880 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
21890 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
218a0 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
218b0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
218c0 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
218d0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
218e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
218f0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
21900 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
21910 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
21920 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
21930 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
21940 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
21950 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
21960 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20  pTab );.    if( 
21970 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
21980 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
21990 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
219a0 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
219b0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
219c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
219d0 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
219e0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
219f0 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
21a00 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
21a10 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23  ssert( i==0 );.#
21a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21a30 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c  IT_CTE.      sel
21a40 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b  ectPopWith(pWalk
21a50 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20  er, p);.#endif. 
21a60 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
21a70 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Prune;.    }.#if
21a80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21a90 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
21aa0 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
21ab0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
21ac0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
21ad0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
21ae0 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
21af0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
21b00 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
21b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21b20 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
21b30 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
21b40 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
21b50 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
21b60 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
21b70 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
21b80 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
21b90 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
21ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
21bb0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
21bc0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
21bd0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
21be0 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  Sel);.      pFro
21bf0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
21c00 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
21c10 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
21c20 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
21c30 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
21c40 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21c50 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20       pTab->nRef 
21c60 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 1;.      pTab-
21c70 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
21c80 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
21c90 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69  ite_sq_%p", (voi
21ca0 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
21cb0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
21cc0 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
21cd0 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
21ce0 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e      selectColumn
21cf0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
21d00 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
21d10 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
21d20 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
21d30 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
21d40 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
21d50 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34  b->nRowEst = 104
21d60 38 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61 62  8576;.      pTab
21d70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
21d80 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
21d90 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
21da0 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
21db0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
21dc0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
21dd0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
21de0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
21df0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
21e00 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
21e10 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
21e20 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
21e30 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
21e40 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
21e50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21e60 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
21e70 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
21e80 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
21e90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21ea0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
21eb0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
21ec0 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
21ed0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
21ee0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
21ef0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
21f00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
21f10 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
21f30 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
21f40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21f50 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
21f60 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
21f70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
21f80 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
21f90 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
21fa0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
21fb0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
21fc0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
21fd0 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
21fe0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
21ff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
22000 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
22010 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
22020 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
22030 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
22040 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
22050 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
22060 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
22070 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
22080 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
22090 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
220a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
220b0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
220c0 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
220d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
220e0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
220f0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
22100 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
22110 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
22120 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
22130 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
22140 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
22150 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
22160 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
22170 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
22180 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
22190 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
221a0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
221b0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
221c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
221d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
221e0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
221f0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
22200 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
22210 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
22220 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
22230 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
22240 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
22250 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
22260 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
22270 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
22280 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
22290 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
222a0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
222b0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
222c0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
222d0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
222e0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
222f0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
22300 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
22310 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
22320 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
22330 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
22340 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
22350 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
22360 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
22370 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
22380 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
22390 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
223a0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
223b0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
223c0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
223d0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
223e0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
223f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
22400 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
22410 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
22420 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
22430 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
22440 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
22450 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
22460 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
22470 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
22480 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
22490 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
224a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
224b0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
224c0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
224d0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
224e0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
224f0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
22500 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
22510 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
22520 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
22530 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
22540 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
22550 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
22560 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
22570 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
22580 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
22590 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
225a0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
225b0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
225c0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
225d0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
225e0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
225f0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
22600 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
22610 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
22620 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
22630 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
22640 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
22650 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
22660 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
22670 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
22680 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
22690 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
226a0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
226b0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
226c0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
226e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
226f0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
22700 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
22710 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d   processing FROM
22720 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
22730 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  es, it is always
22740 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a   the case.    **
22750 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d   that full_colum
22760 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20  n_names=OFF and 
22770 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
22780 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20  es=ON.  The.    
22790 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  ** sqlite3Result
227a0 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f  SetOfSelect() ro
227b0 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73  utine makes it s
227c0 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
227d0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
227e0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
227f0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
22800 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
22810 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d  _FullColNames)==
22820 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
22830 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
22840 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
22850 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f  )!=0) );..    fo
22860 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
22870 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
22880 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
22890 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
228a0 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
228b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
228c0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
228d0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
228e0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
228f0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
22900 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
22910 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
22920 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
22930 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
22940 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
22950 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
22960 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
22970 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
22980 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22990 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
229a0 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
229b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
229c0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
229d0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
229e0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
229f0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
22a00 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
22a10 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
22a20 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
22a30 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
22a40 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
22a50 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
22a60 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
22a70 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
22a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
22a90 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
22aa0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
22ab0 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
22ac0 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
22ad0 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
22ae0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
22af0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
22b00 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
22b10 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
22b20 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
22b30 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
22b40 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
22b50 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
22b60 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
22b70 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
22b80 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
22b90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
22ba0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
22bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
22bc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22bd0 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
22be0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
22bf0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
22c00 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
22c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22c20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
22c30 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
22c40 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
22c50 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
22c60 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
22c70 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
22c80 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
22c90 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
22ca0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
22cb0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
22cc0 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
22cd0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
22ce0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22cf0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
22d00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
22d10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
22d20 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
22d30 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
22d40 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
22d50 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
22d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
22d70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22d80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22d90 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
22da0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
22db0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
22dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22dd0 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
22de0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
22df0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
22e00 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
22e10 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
22e30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22e50 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
22e60 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
22e70 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
22e80 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
22e90 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
22ea0 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
22eb0 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
22ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ed0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
22ee0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
22f00 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
22f10 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
22f20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
22f30 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
22f40 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
22f50 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
22f60 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
22f70 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
22f80 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
22f90 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
22fa0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
22fb0 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
22fc0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
22fd0 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
22fe0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
22ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
23000 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
23010 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
23020 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
23030 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
23040 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
23050 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
23060 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
23070 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
23080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23090 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
230a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
230b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
230c0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
230d0 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
230e0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
230f0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
23100 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
23110 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
23120 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
23130 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
23140 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
23150 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
23160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23170 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
23180 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
23190 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
231a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
231b0 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
231c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
231d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
231e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
231f0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
23200 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
23210 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
23220 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
23230 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
23240 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
23250 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23270 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
23280 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
23290 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
232a0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
232c0 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
232d0 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
232e0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
232f0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
23300 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
23310 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
23320 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
23330 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
23340 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
23350 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23360 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
23370 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
23380 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
23390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
233a0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
233b0 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
233c0 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
233d0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
233e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
233f0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
23400 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
23410 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
23420 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
23430 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
23440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
23460 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
23470 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
23480 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
23490 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
234a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
234b0 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
234c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
234d0 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
234e0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
23500 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
23510 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
23520 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
23530 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
23540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23550 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
23560 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
23570 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
23580 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
23590 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
235a0 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
235b0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
235c0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
235d0 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
235e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
235f0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
23600 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
23610 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
23620 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
23630 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23640 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
23650 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
23660 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
23670 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
23680 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
23690 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
236a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
236b0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
236c0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
236d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
236e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
236f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
23700 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
23710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23720 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
23730 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
23740 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
23750 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
23760 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
23770 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
23780 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
23790 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
237a0 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
237b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
237c0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
237d0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
237e0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
237f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
23800 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
23810 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
23820 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
23830 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
23840 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
23850 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
23860 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
23870 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
23880 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
23890 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
238a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
238b0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
238c0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
238d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
238e0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
238f0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
23900 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
23930 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
23940 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
23980 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
23990 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
239a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
239b0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
239c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
239d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
239e0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
239f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
23a00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
23a10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23a20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
23a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23a40 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
23a50 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
23a60 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
23a70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23a80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23a90 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
23aa0 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
23ab0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
23ac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23ad0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23ae0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
23af0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
23b00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23b20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23b30 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
23b40 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
23b50 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
23b60 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
23b70 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
23b80 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
23b90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
23ba0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
23bb0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
23bc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
23bd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23be0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
23bf0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
23c00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
23c10 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23c20 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
23c30 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
23c40 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
23c50 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
23c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23c70 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
23c80 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
23c90 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
23ca0 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
23cb0 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
23cc0 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
23cd0 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
23ce0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
23cf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23d00 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
23d10 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
23d20 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
23d30 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
23d40 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
23d50 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
23d60 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
23d70 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
23d80 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
23d90 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
23da0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
23db0 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
23dc0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
23dd0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
23de0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
23df0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23e00 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
23e10 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
23e20 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
23e30 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
23e40 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
23e50 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
23e60 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
23e70 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
23e80 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
23e90 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
23ea0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
23eb0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
23ec0 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
23ed0 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
23ee0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
23ef0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23f00 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
23f10 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
23f20 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
23f30 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
23f40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
23f50 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
23f60 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
23f70 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
23f80 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
23f90 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
23fa0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
23fb0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
23fc0 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
23fd0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
23fe0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
23ff0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
24000 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
24010 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
24020 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
24030 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
24040 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
24050 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
24060 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
24070 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
24080 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
24090 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
240a0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
240b0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
240c0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
240d0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
240e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61    if( pParse->ha
240f0 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
24100 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
24110 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
24120 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
24130 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  uery;.    sqlite
24140 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
24150 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
24160 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
24170 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
24180 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  er;.  w.xSelectC
24190 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
241a0 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69  tPopWith;.  sqli
241b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
241c0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
241d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
241e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
241f0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
24200 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
24210 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
24220 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
24230 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
24240 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
24250 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
24260 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
24270 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
24280 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
24290 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
242a0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
242b0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
242c0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
242d0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
242e0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
242f0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
24300 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
24310 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
24320 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
24330 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
24340 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
24350 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
24360 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
24370 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
24380 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
24390 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
243a0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
243b0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
243c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
243d0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
243e0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
243f0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
24400 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
24410 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
24420 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24430 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
24440 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
24450 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
24460 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
24470 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24480 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
24490 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
244a0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
244b0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
244c0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
244d0 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
244e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
244f0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
24500 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
24510 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
24520 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
24530 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
24540 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
24550 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
24560 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
24570 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
24580 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
24590 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
245a0 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
245b0 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
245c0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
245d0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
245e0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
245f0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
24600 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
24610 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
24620 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
24630 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
24640 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
24650 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
24660 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
24670 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
24680 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  or;.          se
24690 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
246a0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
246b0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
246c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
246d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
246e0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
246f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
24700 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
24710 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24720 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
24730 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
24740 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
24750 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
24760 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
24770 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
24780 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
24790 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
247a0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
247b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
247c0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
247d0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
247e0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
247f0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
24800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24810 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
24820 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
24830 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
24840 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
24850 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
24860 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
24870 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
24880 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
24890 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
248a0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
248b0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
248c0 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
248d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
248e0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
248f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24900 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
24910 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
24920 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
24930 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
24940 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
24950 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
24960 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
24970 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
24980 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
24990 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
249a0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
249b0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
249c0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
249d0 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
249e0 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
249f0 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
24a00 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
24a10 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
24a20 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
24a30 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
24a40 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
24a50 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
24a60 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
24a70 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
24a80 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
24a90 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
24aa0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
24ab0 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
24ac0 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
24ad0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24ae0 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
24af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
24b10 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
24b20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
24b30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
24b40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24b50 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
24b60 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
24b70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
24b80 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
24b90 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
24ba0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
24bb0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
24bc0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
24bd0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
24be0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24bf0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
24c00 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
24c10 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
24c20 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
24c30 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
24c40 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
24c50 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
24c60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24c70 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
24c80 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
24c90 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
24ca0 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
24cb0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
24cc0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
24cd0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
24ce0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
24cf0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
24d00 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
24d10 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
24d20 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
24d30 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
24d40 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
24d50 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
24d60 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
24d70 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
24d80 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
24d90 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
24da0 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
24db0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
24dc0 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
24dd0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
24de0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
24df0 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
24e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
24e10 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
24e20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
24e30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
24e40 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
24e50 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
24e60 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
24e70 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
24e80 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
24e90 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
24ea0 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
24eb0 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
24ec0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
24ed0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
24ee0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
24ef0 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
24f00 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
24f10 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
24f20 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
24f30 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
24f40 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
24f50 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
24f60 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
24f70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
24f80 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
24f90 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
24fa0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
24fb0 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
24fc0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
24fd0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
24fe0 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
24ff0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
25000 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
25010 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
25020 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
25030 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
25040 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
25050 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
25060 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
25070 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
25080 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
25090 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
250a0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
250b0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
250c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
250d0 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
250e0 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
250f0 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
25100 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
25110 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
25120 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
25130 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
25140 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
25150 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
25160 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
25170 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
25180 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
25190 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
251a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
251b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
251c0 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
251d0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
251e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
251f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25200 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
25210 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
25220 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
25230 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
25240 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
25250 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
25260 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
25270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
25280 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
25290 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
252a0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
252b0 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 29 3b 0a  E->x.pList, 0);.
252c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
252d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
252e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
252f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
25300 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
25330 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
25340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
25360 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
25370 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
25380 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
25390 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
253a0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
253b0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
253c0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
253d0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
253e0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
253f0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
25400 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25410 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
25420 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
25430 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
25440 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
25450 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
25460 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
25470 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
25480 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
25490 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
254a0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
254b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
254c0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
254d0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
254e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
254f0 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
25500 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
25510 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
25520 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
25540 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
25550 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
25560 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
25570 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
25580 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
25590 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
255a0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
255b0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
255c0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
255d0 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
255e0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
255f0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
25600 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
25610 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25620 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
25630 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
25640 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
25650 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
25660 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
25670 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
25680 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
25690 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
256a0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
256b0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
256c0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
256d0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
256e0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
256f0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
25700 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
25710 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
25720 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
25730 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
25740 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
25750 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25760 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
25770 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
25780 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
25790 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
257a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
257b0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
257c0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
257d0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
257e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
257f0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
25800 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
25810 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  gg, SQLITE_ECEL_
25820 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
25830 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
25840 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
25850 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
25860 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
25870 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
25880 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
25890 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
258a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
258b0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
258c0 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
258d0 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
258e0 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
258f0 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
25900 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
25910 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
25920 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
25930 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
25940 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
25950 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
25960 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
25970 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
25980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
25990 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
259a0 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
259b0 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
259c0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
259d0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
259e0 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
259f0 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
25a00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
25a10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25a20 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
25a30 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
25a40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
25a50 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
25a60 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
25a70 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
25a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25a90 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
25aa0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
25ab0 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
25ac0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
25ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25ae0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
25af0 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
25b00 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
25b10 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
25b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25b30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25b40 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
25b50 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
25b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25b70 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
25b80 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
25b90 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
25ba0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
25bb0 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
25bc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25bd0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
25be0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
25bf0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
25c00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
25c10 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
25c20 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
25c30 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
25c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
25c50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
25c60 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
25c70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25c80 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
25c90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
25ca0 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
25cb0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
25cc0 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
25cd0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
25ce0 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
25cf0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
25d00 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
25d10 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
25d20 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
25d30 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
25d40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25d50 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
25d60 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
25d70 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
25d80 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
25d90 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
25da0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
25db0 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
25dc0 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
25dd0 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
25de0 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
25df0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
25e00 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
25e10 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
25e20 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
25e30 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
25e40 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
25e50 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
25e60 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
25e70 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
25e80 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
25e90 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
25ea0 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
25eb0 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
25ec0 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
25ed0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
25ee0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
25ef0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
25f00 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
25f10 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
25f20 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
25f30 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
25f40 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
25f50 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
25f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
25f70 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
25f80 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
25f90 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
25fa0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
25fb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
25fc0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
25fd0 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29  f( addrHitTest )
25fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
25ff0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
26000 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d  rHitTest);.  }.}
26010 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
26020 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  ngle OP_Explain 
26030 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
26040 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61  he VDBE to expla
26050 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63  in a simple.** c
26060 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22  ount(*) query ("
26070 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
26080 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a  FROM pTab")..*/.
26090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
260a0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74  MIT_EXPLAIN.stat
260b0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53  ic void explainS
260c0 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61  impleCount(.  Pa
260d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
260f0 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
26100 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
26130 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
26140 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
26170 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20   optimize scan, 
26180 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
26190 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
261a0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
261b0 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
261c0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
261d0 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
261e0 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
261f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
26200 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20  .        pIdx ? 
26210 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
26220 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
26230 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
26240 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
26250 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
26260 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
26270 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
26280 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
26290 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
262a0 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
262b0 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
262c0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
262d0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
262e0 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
262f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
26300 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
26310 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
26320 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
26330 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
26340 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
26350 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
26360 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
26370 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
26380 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
26390 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
263a0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
263b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
263c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
263d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
263e0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
263f0 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
26400 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
26410 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
26420 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
26430 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
26440 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
26450 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
26460 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
26470 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
26480 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
26490 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
264a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
264b0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
264c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
264d0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
264e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
264f0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
26500 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
26510 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
26520 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
26530 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
26540 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
26550 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
26560 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
26570 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
26580 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
26590 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
265a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
265b0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
265c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
265d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
265e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
265f0 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
26600 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26610 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
26620 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
26630 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
26640 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
26650 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
26660 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
26670 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
26680 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
26690 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
266a0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
266b0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
266c0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
266d0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
266e0 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
266f0 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
26700 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
26710 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
26720 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
26730 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
26740 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
26750 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
26760 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
26770 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
26780 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
26790 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
267a0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
267b0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
267c0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
267d0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
267e0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
267f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
26800 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
26810 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
26820 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
26830 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
26840 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
26850 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
26860 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
26870 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
26880 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
26890 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
268a0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
268b0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
268c0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
268d0 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
268e0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
268f0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
26900 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
26910 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
26920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
26930 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
26940 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
26950 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
26960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26970 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
26980 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
26990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
269a0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
269b0 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
269c0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
269d0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
269e0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
269f0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
26a00 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
26a10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
26a20 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
26a30 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
26a40 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
26a50 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
26a60 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
26a70 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
26a80 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
26a90 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
26aa0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
26ab0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
26ac0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
26ad0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
26ae0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
26af0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
26b00 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
26b10 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
26b20 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
26b30 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
26b40 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
26b50 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
26b60 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
26b70 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  rd);.    /* If O
26b80 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
26b90 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
26ba0 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
26bb0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
26bc0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
26bd0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
26be0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
26bf0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26c00 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
26c10 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
26c20 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
26c30 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
26c40 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
26c50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
26c60 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
26c70 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
26c80 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
26c90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
26ca0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
26cb0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
26cc0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
26cd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26ce0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
26cf0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41  t_end;.  }.  isA
26d00 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
26d10 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
26d20 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  )!=0;.  assert( 
26d30 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
26d40 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
26d50 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
26d60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
26d70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
26d80 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
26d90 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
26da0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
26db0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
26dc0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
26dd0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
26de0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
26df0 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
26e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26e10 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
26e20 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
26e30 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
26e40 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
26e50 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67  >nExpr) ){.    g
26e60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
26e70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
26e80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26e90 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
26ea0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
26eb0 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
26ec0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26ed0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
26ee0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26ef0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
26f00 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
26f10 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
26f20 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
26f30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26f40 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
26f50 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
26f60 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
26f70 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
26f80 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
26f90 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
26fa0 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
26fb0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
26fc0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
26fd0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
26fe0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
26ff0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
27000 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
27010 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
27020 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
27030 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
27040 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
27050 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
27060 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
27070 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
27080 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
27090 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
270a0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
270b0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
270c0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
270d0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
270e0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
270f0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
27100 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
27110 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
27120 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
27130 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
27140 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
27150 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
27160 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
27170 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
27180 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
27190 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
271a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
271b0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
271c0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
271d0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
271e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
271f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
27200 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
27210 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
27220 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
27230 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
27240 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
27250 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
27260 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
27270 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
27280 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
27290 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
272a0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
272b0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
272c0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
272d0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
272e0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
272f0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
27300 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
27310 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
27320 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
27330 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
27340 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
27350 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
27360 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
27370 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
27380 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
27390 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
273a0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
273b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
273c0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
273d0 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
273e0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
273f0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
27400 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
27410 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
27420 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
27430 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
27440 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
27450 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
27460 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
27470 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
27480 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
27490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
274a0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
274b0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
274c0 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20  c==1.           
274d0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
274e0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
274f0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
27500 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
27510 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
27520 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
27530 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
27540 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
27550 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
27560 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
27570 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
27580 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
27590 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
275a0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
275b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
275c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
275d0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
275e0 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
275f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
27600 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
27610 6f 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  o, pItem->iCurso
27620 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
27630 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
27640 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
27650 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f  omment((v, "coro
27660 75 74 69 6e 65 20 25 73 22 2c 20 70 49 74 65 6d  utine %s", pItem
27670 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
27680 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
27690 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
276a0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
276b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
276c0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
276d0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
276e0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
276f0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
27700 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
27710 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
27720 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
27730 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
27740 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
27750 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
27760 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
27770 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
27780 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
27790 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
277a0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
277b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
277c0 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
277d0 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64  ddrTop, dest.iSd
277e0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
277f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
27800 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e  , addrTop, dest.
27810 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
27820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
27830 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
27840 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
27850 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
27860 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
27870 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
27880 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
27890 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
278a0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
278b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
278c0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
278d0 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
278e0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
278f0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
27900 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
27910 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
27920 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
27930 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
27940 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
27950 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
27960 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
27970 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
27980 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
27990 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
279a0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
279b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
279c0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
279d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
279e0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
279f0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
27a00 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
27a10 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
27a20 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
27a30 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
27a40 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
27a50 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
27a60 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
27a70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
27a80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
27a90 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
27aa0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
27ab0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
27ac0 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
27ad0 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
27ae0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
27af0 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70 49 74  rialize %s", pIt
27b00 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
27b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
27b20 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
27b30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
27b40 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
27b50 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
27b60 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
27b70 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
27b80 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
27b90 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
27ba0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
27bb0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
27bc0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
27bd0 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
27be0 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
27bf0 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
27c00 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nce(pParse);.   
27c10 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
27c20 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
27c30 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
27c40 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
27c50 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70  rsor);.      exp
27c60 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
27c70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
27c80 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
27c90 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
27ca0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
27cb0 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
27cc0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
27cd0 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  em->pTab->nRowEs
27ce0 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53  t = (unsigned)pS
27cf0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
27d00 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
27d10 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
27d20 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
27d30 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
27d40 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
27d50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
27d60 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
27d70 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
27d80 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
27d90 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
27da0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
27db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27dc0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
27dd0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
27de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
27df0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
27e00 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
27e10 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
27e20 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
27e30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
27e40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
27e50 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
27e60 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
27e70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
27e80 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
27e90 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
27ea0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
27eb0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
27ec0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
27ed0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
27ee0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
27ef0 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
27f00 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
27f10 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
27f20 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
27f30 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
27f40 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
27f50 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
27f60 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
27f70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
27f80 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
27f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27fa0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
27fb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
27fc0 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
27fd0 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
27fe0 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
27ff0 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
28000 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
28010 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
28020 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
28030 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
28040 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
28050 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
28060 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
28070 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
28080 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
28090 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
280a0 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
280b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
280c0 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
280d0 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
280e0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
280f0 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
28100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28110 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
28120 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
28130 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
28140 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
28150 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
28160 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
28170 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28180 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28190 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
281a0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
281b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
281c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
281d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
281e0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
281f0 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
28200 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
28210 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
28220 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
28230 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  eSelectId);.    
28240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
28250 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
28260 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
28270 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
28280 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
28290 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a  nd they are.  **
282a0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
282b0 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
282c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e  ER BY clause sin
282d0 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a  ce the GROUP BY.
282e0 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20    ** will cause 
282f0 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
28300 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72   out in the corr
28310 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ect order.  This
28320 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69   is.  ** an opti
28330 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
28340 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
28350 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
28360 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65  rdless..  ** Use
28370 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
28380 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
28390 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
283a0 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a  RL_OPTIMIZER.  *
283b0 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69  * to disable thi
283c0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
283d0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
283e0 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ses..  */.  if( 
283f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
28400 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70  ompare(p->pGroup
28410 42 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31  By, pOrderBy, -1
28420 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
28430 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
28440 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
28450 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b  GroupByOrder) ){
28460 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
28470 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
28480 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
28490 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
284a0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
284b0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
284c0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
284d0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
284e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
284f0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
28500 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
28510 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
28520 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
28530 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
28540 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
28550 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
28560 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
28570 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
28580 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
28590 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
285a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
285b0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
285c0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
285d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
285e0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
285f0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
28600 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
28610 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
28620 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
28630 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
28640 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
28650 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
28660 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
28670 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
28680 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
28690 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
286a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
286b0 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
286c0 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
286d0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
286e0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
286f0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
28700 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
28710 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
28720 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
28730 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
28740 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
28750 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72  rListCompare(pOr
28760 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
28770 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
28780 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
28790 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
287a0 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
287b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
287c0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
287d0 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
287e0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
287f0 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  y;.    pOrderBy 
28800 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69  = 0;.    /* Noti
28810 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
28820 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
28830 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
28840 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
28850 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
28860 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
28870 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
28880 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
28890 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
288a0 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
288b0 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
288c0 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
288d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
288e0 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
288f0 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
28900 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Tnct );.  }..  /
28910 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
28920 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28930 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
28940 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
28950 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
28960 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
28970 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
28980 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
28990 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
289a0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
289b0 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
289c0 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
289d0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
289e0 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
289f0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
28a00 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
28a10 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
28a20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
28a30 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
28a40 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
28a50 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
28a60 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
28a70 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
28a80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
28a90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
28aa0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
28ab0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
28ac0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
28ad0 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
28ae0 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 4f 72  rBy, 0);.    pOr
28af0 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
28b00 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
28b10 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
28b20 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
28b30 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
28b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28b50 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
28b60 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
28b90 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
28ba0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
28bd0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
28be0 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NFO);.  }else{. 
28bf0 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78     addrSortIndex
28c00 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
28c10 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
28c20 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
28c30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
28c40 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
28c50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
28c60 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28c70 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
28c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28c90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
28ca0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
28cb0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
28cc0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
28cd0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
28ce0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
28cf0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28d00 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
28d10 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45  electRow = LARGE
28d20 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70  ST_INT64;.  comp
28d30 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
28d40 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
28d50 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
28d60 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f  mit==0 && addrSo
28d70 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
28d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
28d90 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  Op(v, addrSortIn
28da0 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  dex)->opcode = O
28db0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20  P_SorterOpen;.  
28dc0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
28dd0 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20   SF_UseSorter;. 
28de0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
28df0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
28e00 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
28e10 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
28e20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
28e30 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
28e40 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
28e50 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
28e60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
28e70 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
28e80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
28e90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
28ea0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
28ed0 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
28ee0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
28f10 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
28f20 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
28f30 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
28f60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28f70 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
28f80 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
28f90 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
28fa0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
28fb0 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
28fc0 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
28fd0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
28fe0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
28ff0 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
29000 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
29010 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
29020 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
29030 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
29040 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
29050 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
29060 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
29070 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
29080 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
29090 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20  INCT : 0);..    
290a0 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
290b0 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
290c0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
290d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
290e0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
290f0 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
29100 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20  , p->pEList,.   
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
29130 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  lFlags, 0);.    
29140 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
29150 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
29160 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29170 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
29180 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
29190 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
291a0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
291b0 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
291c0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
291d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
291e0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
291f0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
29200 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
29210 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
29220 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
29230 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
29240 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
29250 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
29260 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
29270 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
29280 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
29290 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
292a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
292b0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
292c0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
292d0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
292e0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
292f0 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
29300 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
29310 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
29320 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
29330 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
29340 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
29350 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
29360 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
29370 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
29380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29390 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
293a0 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  , addrSortIndex)
293b0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
293c0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
293d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
293e0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
293f0 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
29400 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
29410 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
29420 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72  List, -1, pOrder
29430 42 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  By, &sDistinct, 
29440 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
29450 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29460 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
29470 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
294a0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
294b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
294c0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
294d0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
294e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
294f0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
29500 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
29510 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
29520 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
29530 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
29540 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
29550 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
29560 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
29570 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
29580 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
29590 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
295a0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
295b0 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
295c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
295d0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
295e0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
295f0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
29600 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
29610 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
29620 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
29630 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
29640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
29650 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
29660 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
29670 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
29680 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
29690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
296a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
296b0 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
296c0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
296d0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
29700 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
29710 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
29720 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
29730 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
29740 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
29750 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
29760 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
29770 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
29780 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
29790 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
297a0 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
297b0 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
297c0 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
297d0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
297e0 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
297f0 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
29800 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
29810 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
29820 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
29830 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
29840 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
29850 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
29860 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
29870 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
29880 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
29890 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
298a0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
298b0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
298c0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
298d0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
298e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
298f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29900 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
29910 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29920 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
29930 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
29940 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
29950 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
29960 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
29970 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
29980 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
29990 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
299a0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
299b0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
299c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
299d0 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
299e0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
299f0 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
29a00 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
29a10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
29a20 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
29a30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29a40 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
29a50 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
29a60 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
29a70 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
29a80 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
29a90 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.. .    /* Crea
29aa0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
29ab0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
29ac0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
29ad0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
29ae0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
29af0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29b00 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
29b10 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
29b20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
29b30 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
29b40 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
29b50 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
29b60 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
29b70 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
29b80 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
29b90 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
29ba0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
29bb0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
29bc0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
29bd0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
29be0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
29bf0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
29c00 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
29c10 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
29c20 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
29c30 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
29c40 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
29c50 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
29c60 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
29c70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
29c80 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
29c90 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
29ca0 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
29cb0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
29cc0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
29cd0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
29ce0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
29cf0 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
29d00 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
29d10 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
29d20 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
29d30 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
29d40 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
29d50 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
29d60 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
29d70 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
29d80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
29d90 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
29da0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29db0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29dc0 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
29dd0 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
29de0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
29df0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
29e00 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
29e10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29e20 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
29e30 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
29e40 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
29e50 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
29e60 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
29e70 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
29e80 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
29e90 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
29ea0 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
29eb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29ec0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
29ed0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
29ee0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
29ef0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
29f00 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
29f10 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
29f20 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
29f30 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
29f40 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
29f50 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
29f60 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
29f70 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
29f80 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
29f90 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
29fa0 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
29fb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
29fc0 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
29fd0 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
29fe0 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
29ff0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2a000 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
2a010 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
2a020 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2a030 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
2a040 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
2a050 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
2a060 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2a070 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
2a080 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
2a090 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
2a0a0 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
2a0b0 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
2a0c0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
2a0d0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
2a0e0 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
2a0f0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
2a100 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2a110 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
2a120 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2a130 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
2a140 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
2a150 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
2a160 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
2a170 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
2a180 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
2a190 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
2a1a0 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
2a1b0 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2a1c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
2a1d0 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
2a1e0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
2a1f0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
2a200 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
2a210 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
2a220 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
2a230 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
2a240 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
2a250 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
2a260 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
2a270 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
2a280 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
2a290 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
2a2a0 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
2a2b0 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
2a2c0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
2a2d0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2a2e0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
2a2f0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
2a300 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
2a310 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2a320 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2a330 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2a340 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2a350 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  pBy, 0);.      a
2a360 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2a370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a380 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2a390 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2a3a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2a3b0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2a3c0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2a3d0 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2a3e0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2a3f0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2a400 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2a410 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2a420 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2a430 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2a440 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2a450 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2a460 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2a470 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2a480 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a490 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2a4a0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2a4b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2a4c0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2a4d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a4e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2a4f0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2a500 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2a510 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2a520 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2a530 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2a540 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2a550 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2a560 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2a570 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2a580 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2a590 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2a5a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2a5b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2a5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a5d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2a5e0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2a5f0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2a600 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2a610 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2a620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a640 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2a650 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2a660 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2a670 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2a680 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2a690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a6a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2a6b0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2a6c0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2a6d0 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2a6e0 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2a6f0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2a700 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2a710 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2a720 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2a730 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2a740 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2a750 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2a760 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2a770 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2a780 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2a790 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2a7a0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2a7b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2a7c0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2a7d0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2a7e0 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2a7f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a800 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2a810 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2a820 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2a830 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2a840 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2a850 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2a860 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2a870 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
2a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a890 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
2a8a0 50 42 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  PBY, 0);.      i
2a8b0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2a8c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2a8d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a8e0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2a8f0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
2a900 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2a910 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2a920 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2a930 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2a940 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2a950 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2a960 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2a970 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2a980 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2a990 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2a9a0 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2a9b0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2a9c0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2a9d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a9e0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2a9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2aa00 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2aa10 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2aa20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2aa30 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2aa40 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2aa50 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2aa60 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2aa70 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2aa80 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2aa90 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2aaa0 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2aab0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2aac0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2aad0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2aae0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2aaf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2ab00 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2ab10 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2ab20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2ab30 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2ab40 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2ab50 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2ab60 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2ab70 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2ab80 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2ab90 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2aba0 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2abd0 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2abe0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2abf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2ac00 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2ac10 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2ac20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2ac30 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a  y + 1;.        j
2ac40 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
2ac50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2ac60 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2ac70 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2ac80 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
2ac90 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
2aca0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2acb0 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
2acc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
2acd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ace0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2acf0 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
2ad00 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2ad10 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
2ad20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ad30 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2ad40 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2ad50 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
2ad60 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2ad70 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  upBy, regBase, 0
2ad80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ad90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ada0 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67  OP_Sequence, sAg
2adb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2adc0 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42  ,regBase+nGroupB
2add0 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  y);.        j = 
2ade0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
2adf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2ae00 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2ae10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2ae20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2ae30 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
2ae40 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
2ae50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2ae60 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2ae70 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2ae80 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
2ae90 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2aea0 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20       int r2;..  
2aeb0 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73            r2 = s
2aec0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
2aed0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
2aee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
2af10 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
2af20 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b  >iTable, r1, 0);
2af30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2af40 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20   r1!=r2 ){.     
2af50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2af60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2af70 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b  _SCopy, r2, r1);
2af80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2af90 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2afa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2afb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2afc0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
2afd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2afe0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2aff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2b000 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2b010 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
2b020 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2b030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2b050 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
2b060 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
2b070 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2b080 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2b090 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2b0a0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2b0b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2b0c0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2b0d0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
2b0e0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2b0f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2b100 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
2b110 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2b120 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
2b130 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2b140 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
2b150 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
2b160 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2b170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b180 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2b190 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
2b1a0 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
2b1b0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2b1c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b1d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
2b1e0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2b1f0 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
2b200 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2b210 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
2b220 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20  BY sort"));.    
2b230 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
2b240 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
2b250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b260 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b270 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  arse);.      }..
2b280 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
2b290 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2b2a0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
2b2b0 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
2b2c0 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
2b2d0 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
2b2e0 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
2b2f0 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
2b300 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
2b310 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
2b320 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
2b330 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
2b340 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
2b350 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
2b360 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
2b370 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
2b380 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
2b390 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
2b3a0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
2b3b0 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
2b3c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b3d0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2b3e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2b3f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2b400 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2b410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b430 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
2b440 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2b450 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20  dx, sortOut);.  
2b460 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2b470 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
2b480 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
2b490 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2b4a0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2b4b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b4c0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
2b4d0 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20  n, sortPTab, j, 
2b4e0 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2b4f0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73      if( j==0 ) s
2b500 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b510 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
2b520 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
2b530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b540 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
2b550 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
2b560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b570 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
2b580 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
2b590 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
2b5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b5c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2b5d0 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
2b5e0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2b5f0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
2b620 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
2b630 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
2b640 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
2b650 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2b660 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2b670 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2b680 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c  , OP_Jump, j1+1,
2b690 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20   0, j1+1);..    
2b6a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2b6b0 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
2b6c0 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
2b6d0 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
2b6e0 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
2b6f0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
2b700 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2b710 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
2b720 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
2b730 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
2b740 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
2b750 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
2b760 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2b770 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
2b780 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
2b790 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
2b7a0 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
2b7b0 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
2b7c0 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
2b7d0 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
2b7e0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2b7f0 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
2b800 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2b810 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2b820 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
2b830 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
2b840 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
2b850 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
2b860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2b870 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
2b880 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
2b890 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2b8a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b8b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b8c0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2b8d0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2b8e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2b8f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2b900 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
2b910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2b930 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
2b940 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
2b950 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b960 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
2b970 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2b980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b990 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2b9a0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2b9b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2b9c0 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
2b9d0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2b9e0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2b9f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2ba00 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
2ba10 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
2ba20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2ba30 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
2ba40 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2ba50 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2ba60 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
2ba70 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
2ba80 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2ba90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2baa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2bab0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
2bac0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2bad0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2bae0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
2baf0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2bb00 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
2bb10 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
2bb20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
2bb30 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2bb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bb50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2bb60 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
2bb70 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2bb80 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
2bb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bba0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2bbb0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2bbc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2bbd0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
2bbe0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
2bbf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2bc00 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
2bc10 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
2bc20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2bc30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2bc40 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2bc50 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2bc60 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2bc70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bc80 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
2bc90 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
2bca0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
2bcb0 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
2bcc0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2bcd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2bce0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
2bcf0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
2bd00 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2bd10 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2bd20 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
2bd30 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
2bd40 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
2bd50 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
2bd60 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
2bd70 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
2bd80 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
2bd90 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2bda0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
2bdb0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
2bdc0 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
2bdd0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
2bde0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
2bdf0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
2be00 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
2be10 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
2be20 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
2be30 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
2be40 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
2be50 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
2be60 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
2be70 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
2be80 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
2be90 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
2bea0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
2beb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2bec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2bee0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
2bef0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2bf00 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2bf10 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
2bf20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bf30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2bf40 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2bf50 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
2bf60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2bf70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
2bf80 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
2bf90 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2bfa0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2bfb0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2bfc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bfd0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
2bfe0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
2bff0 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
2c000 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2c010 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
2c020 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
2c030 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
2c040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c050 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2c060 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
2c070 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
2c080 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
2c090 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2c0a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2c0b0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2c0c0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
2c0d0 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
2c0e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2c0f0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2c100 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2c110 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f  ->pEList, -1, pO
2c120 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2c140 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2c150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c160 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
2c170 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
2c180 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
2c190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2c1a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2c1b0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2c1c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2c1d0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
2c1e0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
2c1f0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
2c200 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2c210 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2c220 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
2c230 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
2c240 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2c250 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2c260 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
2c270 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
2c280 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2c290 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2c2a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c2b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2c2c0 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
2c2d0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
2c2e0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
2c2f0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
2c300 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
2c310 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
2c320 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
2c330 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
2c340 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c350 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
2c360 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2c370 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
2c380 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
2c390 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
2c3a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c3b0 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
2c3c0 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
2c3d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
2c3e0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
2c3f0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
2c400 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2c410 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
2c420 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c430 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
2c440 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
2c450 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
2c460 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
2c470 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2c480 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
2c490 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
2c4a0 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
2c4b0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
2c4c0 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
2c4d0 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
2c4e0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
2c4f0 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
2c500 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
2c510 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
2c520 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
2c530 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
2c540 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2c550 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2c560 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
2c570 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
2c580 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
2c590 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
2c5a0 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
2c5b0 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
2c5c0 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
2c5d0 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
2c5e0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
2c5f0 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
2c600 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
2c610 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2c620 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
2c630 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2c640 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
2c650 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
2c660 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
2c670 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2c680 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
2c690 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2c6a0 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
2c6b0 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
2c6c0 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2c6d0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2c700 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2c710 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2c720 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
2c730 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
2c740 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
2c750 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
2c760 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2c790 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
2c7a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
2c7b0 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c7d0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
2c7e0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
2c7f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2c800 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2c810 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2c820 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2c830 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2c840 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2c850 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2c860 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
2c870 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
2c880 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
2c890 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
2c8a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c8b0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
2c8c0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
2c8d0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
2c8e0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
2c8f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c900 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
2c910 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
2c920 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
2c930 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
2c940 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c950 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
2c960 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
2c970 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
2c980 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
2c990 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
2c9a0 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
2c9b0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
2c9c0 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
2c9d0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2c9e0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
2c9f0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
2ca00 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2ca10 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
2ca20 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2ca30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2ca40 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
2ca50 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
2ca60 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2ca70 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
2ca80 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
2ca90 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
2caa0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
2cab0 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
2cac0 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
2cad0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
2cae0 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
2caf0 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
2cb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cb10 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
2cb20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2cb40 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
2cb50 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
2cb60 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
2cb70 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
2cb80 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
2cb90 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
2cba0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2cbb0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
2cbc0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
2cbd0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
2cbe0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
2cbf0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
2cc00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cc10 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
2cc20 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
2cc30 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
2cc40 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
2cc50 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2cc60 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2cc70 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
2cc80 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
2cc90 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2cca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2ccb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ccc0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
2ccd0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
2cce0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
2ccf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cd00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2cd10 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
2cd20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
2cd30 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
2cd40 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
2cd50 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2cd60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2cd70 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
2cd80 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
2cd90 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
2cda0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
2cdb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
2cdc0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2cdd0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2cde0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
2cdf0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
2ce00 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
2ce10 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
2ce20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
2ce30 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
2ce40 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
2ce50 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
2ce60 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
2ce70 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
2ce80 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
2ce90 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
2cea0 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
2ceb0 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
2cec0 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
2ced0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
2cee0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
2cef0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
2cf00 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
2cf10 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
2cf20 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
2cf30 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
2cf40 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
2cf50 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
2cf60 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
2cf70 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2cf80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
2cf90 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2cfa0 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
2cfb0 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
2cfc0 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
2cfd0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
2cfe0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
2cff0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
2d000 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
2d010 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
2d020 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
2d030 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
2d040 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2d050 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
2d060 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
2d070 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
2d080 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
2d090 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
2d0a0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2d0b0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
2d0c0 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
2d0d0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
2d0e0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
2d0f0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
2d100 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
2d110 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
2d120 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
2d130 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
2d140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2d150 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
2d160 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
2d170 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
2d180 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
2d190 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
2d1a0 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
2d1b0 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
2d1c0 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
2d1d0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
2d1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2d1f0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
2d200 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
2d210 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
2d220 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
2d230 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
2d240 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
2d250 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
2d260 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
2d270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d280 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
2d290 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
2d2a0 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
2d2b0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
2d2c0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2d2d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
2d2e0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
2d2f0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
2d300 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
2d310 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
2d320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2d330 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
2d340 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
2d350 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
2d360 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2d370 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
2d380 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
2d390 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
2d3a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
2d3b0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2d3c0 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
2d3d0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2d3e0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
2d3f0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
2d400 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
2d410 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
2d420 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2d430 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
2d440 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2d450 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
2d460 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
2d470 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
2d480 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
2d490 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
2d4a0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
2d4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d4c0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
2d4d0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
2d4e0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2d4f0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
2d500 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
2d510 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
2d520 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
2d530 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
2d540 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2d550 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
2d560 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
2d570 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
2d580 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
2d590 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2d5a0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2d5b0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2d5c0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2d5d0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2d5e0 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2d5f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2d600 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2d610 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d620 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2d630 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2d640 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2d650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d660 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2d670 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2d680 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2d690 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2d6a0 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2d6b0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2d6c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2d6d0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2d6e0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
2d6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d700 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2d710 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65   0, sqlite3Where
2d720 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2d730 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  o));.          V
2d740 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d750 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d770 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
2d780 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
2d790 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
2d7a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2d7b0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2d7c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
2d7d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2d7e0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2d7f0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
2d800 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
2d810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d820 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2d830 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2d840 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
2d850 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2d860 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2d870 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2d880 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  ist, -1, 0, 0, .
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8a0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
2d8b0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
2d8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d8d0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2d8e0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
2d8f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d900 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2d910 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
2d920 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
2d930 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
2d940 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
2d950 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
2d960 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
2d970 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
2d980 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2d990 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
2d9a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2d9b0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2d9c0 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
2d9d0 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
2d9e0 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
2d9f0 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
2da00 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
2da10 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
2da20 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
2da30 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2da40 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  le(pParse, "ORDE
2da50 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
2da60 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
2da70 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
2da80 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
2da90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
2daa0 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
2dab0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
2dac0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2dad0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
2dae0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
2daf0 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
2db00 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
2db10 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2db20 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
2db30 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
2db40 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
2db50 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
2db60 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
2db70 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
2db80 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
2db90 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
2dba0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
2dbb0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
2dbc0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
2dbd0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2dbe0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
2dbf0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
2dc00 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
2dc10 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
2dc20 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
2dc30 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
2dc40 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
2dc50 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2dc60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
2dc70 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2dc80 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2dc90 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2dca0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2dcb0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
2dcc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2dcd0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
2dce0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2dcf0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2dd00 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
2dd10 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
2dd20 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2dd30 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
2dd40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2dd50 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2dd60 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
2dd70 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
2dd80 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2dd90 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c  id explainOneSel
2dda0 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ect(Vdbe *pVdbe,
2ddb0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73   Select *p){.  s
2ddc0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2ddd0 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45  ntf(pVdbe, "SELE
2dde0 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  CT ");.  if( p->
2ddf0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2de00 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2de10 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28  gate) ){.    if(
2de20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2de30 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2de40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2de50 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2de60 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20  "DISTINCT ");.  
2de70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73    }.    if( p->s
2de80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2de90 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
2dea0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2deb0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67  intf(pVdbe, "agg
2dec0 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a  _flag ");.    }.
2ded0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2dee0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2def0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2df00 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20  rintf(pVdbe, "  
2df10 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   ");.  }.  sqlit
2df20 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2df30 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69  t(pVdbe, p->pELi
2df40 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2df50 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2df60 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
2df70 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
2df80 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2df90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2dfa0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52  rintf(pVdbe, "FR
2dfb0 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  OM ");.    sqlit
2dfc0 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2dfd0 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  dbe);.    for(i=
2dfe0 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
2dff0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2e000 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2e010 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
2e020 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
2e030 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e040 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e050 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65  {%d,*} = ", pIte
2e060 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2e070 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2e080 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2e090 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2e0a0 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74  elect(pVdbe, pIt
2e0b0 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2e0c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2e0d0 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
2e0e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e0f0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e100 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20   (tabname=%s)", 
2e110 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2e120 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
2e130 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2e140 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
2e150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2e160 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e170 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  e, "%s", pItem->
2e180 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
2e190 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2e1a0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
2e1b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e1c0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e1d0 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
2e1e0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
2e1f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2e200 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2e210 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
2e220 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e230 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2e240 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
2e250 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2e260 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2e270 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2e280 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
2e290 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2e2a0 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
2e2b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e2c0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e2d0 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71  WHERE ");.    sq
2e2e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2e2f0 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72  (pVdbe, p->pWher
2e300 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2e310 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2e320 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
2e330 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
2e340 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e350 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50  tf(pVdbe, "GROUP
2e360 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2e370 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2e380 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f  t(pVdbe, p->pGro
2e390 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
2e3a0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2e3b0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2e3c0 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
2e3d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e3e0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56  intf(pVdbe, "HAV
2e3f0 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ING ");.    sqli
2e400 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2e410 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67  Vdbe, p->pHaving
2e420 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e430 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2e440 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
2e450 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
2e460 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2e470 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42  f(pVdbe, "ORDERB
2e480 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2e490 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2e4a0 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65  (pVdbe, p->pOrde
2e4b0 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
2e4c0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e4d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2e4e0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
2e4f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e500 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54  tf(pVdbe, "LIMIT
2e510 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e520 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2e530 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  e, p->pLimit);. 
2e540 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e550 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2e560 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
2e570 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2e580 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2e590 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a  be, "OFFSET ");.
2e5a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e5b0 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2e5c0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
2e5d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2e5e0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  pVdbe);.  }.}.vo
2e5f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
2e600 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  nSelect(Vdbe *pV
2e610 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2e620 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2e630 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e640 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e650 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b  (null-select)");
2e660 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2e670 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72  .  while( p->pPr
2e680 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  ior ){.    p->pP
2e690 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
2e6a0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
2e6b0 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
2e6c0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2e6d0 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  be);.  while( p 
2e6e0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ){.    explainOn
2e6f0 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  eSelect(pVdbe, p
2e700 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  );.    p = p->pN
2e710 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ext;.    if( p==
2e720 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
2e730 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2e740 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2e750 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e760 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20  (pVdbe, "%s\n", 
2e770 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
2e780 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  op));.  }.  sqli
2e790 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e7a0 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a  (pVdbe, "END");.
2e7b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e7c0 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f  Pop(pVdbe);.}../
2e7d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
2e7e0 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
2e7f0 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
2e800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e840 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
2e850 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
2e860 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2e870 58 50 4c 41 49 4e 29 20 2a 2f 0a                 XPLAIN) */.