/ Hex Artifact Content
Login

Artifact fc7499ac90fd4d49782e0a16372d3a5efde2aa3b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3d50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3d60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3d70: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3d90: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3da0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3db0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3dd0: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3de0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3df0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3e10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3e20: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3e30: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3e50: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3e60: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e80: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3e90: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3ea0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3eb0: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3ed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3ee0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3ef0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3f00: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3f10: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3f20: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3f30: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3f40: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3f50: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3f60: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3f70: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3f80: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3f90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3fa0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3fb0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3fc0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3fd0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3fe0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ff0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
4000: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
4010: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
4020: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
4030: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
4040: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
4050: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
4060: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4070: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
4080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4090: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
40a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
40b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
40c0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
40d0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
40e0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
40f0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
4100: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
4110: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
4120: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
4130: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
4140: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
4150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4160: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
4170: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
4180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
41a0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
41b0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
41c0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
41d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
41e0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
41f0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4200: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
4210: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
4220: 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65  em, N);.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4240: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
4250: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4270: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4280: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
4290: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
42a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
42b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
42d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
42e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
42f0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
4300: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
4310: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
4320: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
4330: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
4340: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
4350: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
4360: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
4370: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
4380: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
4390: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
43a0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
43b0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
43c0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
43d0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
43e0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
43f0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
4400: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4410: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
4420: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
4430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4440: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
4450: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4470: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
4480: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
4490: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
44a0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
44b0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
44d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
44e0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
44f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4500: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4510: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4520: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4530: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4540: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
4550: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4580: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
4590: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
45a0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
45b0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
45c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
45d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
45e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
45f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
4610: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4620: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
4630: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
4640: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
4650: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
4660: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
4670: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
4680: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
4690: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
46a0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
46b0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
46c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
46d0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
46e0: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
46f0: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
4700: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
4710: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
4720: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4730: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4740: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
4750: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
4760: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
4770: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
4780: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
4790: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
47a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
47b0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
47c0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
47d0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
47e0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
47f0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
4800: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
4810: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4830: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
4840: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
4850: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
4860: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
4870: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
4880: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
4890: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
48a0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
48b0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
48c0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
48d0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
48e0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
48f0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4900: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4910: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4920: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4930: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
4940: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
4950: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
4960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
4970: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
4980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
49b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
49d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
49e0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
49f0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4a00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4a10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4a20: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4a30: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
4a40: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
4a50: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
4a60: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
4a70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
4a80: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
4a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4aa0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4ab0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4ac0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4ad0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4ae0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4af0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4b00: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
4b10: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
4b20: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
4b30: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
4b40: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
4b50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4b60: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
4b70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4b80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
4b90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4bb0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4bc0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4bd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4c00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
4c10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
4c20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c40: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
4c50: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
4c60: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
4c70: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
4c80: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
4c90: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
4ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
4cb0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
4cc0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
4cd0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
4ce0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
4cf0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4d00: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
4d10: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
4d20: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
4d30: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4d40: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
4d50: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
4d60: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
4d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
4d90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
4da0: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
4db0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
4dc0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4dd0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
4de0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
4df0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
4e00: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
4e10: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
4e20: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4e30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4e40: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4e50: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4e60: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4e70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4e80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4e90: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4ed0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4ee0: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4ef0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4f00: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4f10: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4f20: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4f30: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4f40: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4f50: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4f60: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4f70: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4f80: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4f90: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4fa0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4fb0: 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  Sdst;.  if( nCol
4fc0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4fd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5000: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
5010: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
5020: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
5030: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
5040: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
5050: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
5060: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
5070: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
5080: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
5090: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
50a0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
50b0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
50c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
5130: 70 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  put)?SQLITE_ECEL
5140: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e  _DUP:0);.  }.  n
5150: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5160: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5170: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5180: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5190: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
51a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
51b0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
51c0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51d0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51e0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51f0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
5200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
5210: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
5220: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5230: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5250: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5260: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5270: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5290: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
52a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
52b0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
52c0: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52d0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52e0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5300: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5310: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5320: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5330: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5350: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5360: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5370: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5380: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5390: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
53a0: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
53b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
53c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53e0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
5400: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
5410: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
5420: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5430: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5440: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5450: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5460: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5470: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5480: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5490: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
54a0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
54b0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
54c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54d0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54e0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54f0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
5500: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
5510: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
5520: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5530: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5540: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5550: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5560: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5570: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5580: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5590: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
55a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
55b0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
55c0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55f0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
5600: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5620: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5640: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5650: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5660: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5670: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5680: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
56b0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
56c0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56d0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5710: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
5720: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5760: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5770: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5780: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
57a0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
57b0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
57c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57d0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57f0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5810: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
5820: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5830: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5860: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5870: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5890: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
58a0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
58b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5900: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5910: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5920: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5930: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5940: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5950: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5960: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5990: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59b0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
59c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
5a00: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
5a10: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
5a20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a30: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a70: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a90: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5aa0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5ab0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5ad0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5af0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b10: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5b20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b50: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b70: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b80: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b90: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5bb0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5bc0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5bd0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5be0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bf0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5c00: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5c10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5c20: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c70: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5ca0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5cb0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5cc0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5cd0: 73 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  se SRT_DistTable
5ce0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
5cf0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5d00: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
5d10: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5d20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
5d40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d50: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5d70: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
5d80: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5d90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5da0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5db0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5dc0: 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  , r1);.#ifndef S
5dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
5de0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
5df0: 53 52 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b  SRT_DistTable ){
5e00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5e10: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
5e20: 73 20 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65  s DistTable, the
5e30: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
5e40: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
5e50: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
5e60: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
5e70: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
5e80: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
5e90: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
5ea0: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
5eb0: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
5ec0: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
5ed0: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
5ee0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
5ef0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
5f00: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
5f10: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
5f20: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
5f30: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
5f40: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
5f50: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
5f60: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5f70: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
5f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
5fa0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
5fb0: 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
5fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5fd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
5fe0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
5ff0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6000: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
6010: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
6020: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6030: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
6040: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
6050: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
6060: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  p, r1);.      }e
6070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
6080: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
6090: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
60a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
60b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
60c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
60d0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
60e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
60f0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
6100: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
6110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6120: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6130: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
6140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6150: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6160: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6180: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6190: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
61a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
61b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
61c0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
61d0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
61e0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
61f0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
6200: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
6210: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
6220: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
6230: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
6240: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
6250: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
6260: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
6270: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
6280: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
6290: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
62a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
62b0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
62c0: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
62d0: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
62e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
62f0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
6300: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
6310: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
6320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  t);.      if( pO
6330: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6340: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
6350: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
6360: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
6370: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
6380: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
6390: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
63a0: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
63b0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
63c0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
63d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
63e0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
63f0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
6400: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
6410: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
6420: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
6430: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
6440: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
6450: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
6460: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a   p, regResult);.
6470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6480: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
6490: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
64a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
64b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64c0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
64d0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31  ord, regResult,1
64e0: 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66  ,r1, &pDest->aff
64f0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
6500: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6510: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6520: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6530: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
6540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6550: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6560: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
6570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6580: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6590: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
65a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
65b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
65c0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
65d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
65e0: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
65f0: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
6600: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
6610: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
6620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6630: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6640: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
6650: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6660: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6670: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6680: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
66a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
66b0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
66c0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
66d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
66e0: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
66f0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
6700: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
6710: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
6720: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
6730: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
6740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6750: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
6760: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6770: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
6780: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6790: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
67a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
67b0: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
67c0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
67d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
67e0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
67f0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
6800: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
6810: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6820: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
6830: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
6840: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
6850: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6860: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
6870: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
6880: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
6890: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
68a0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
68b0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
68c0: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
68d0: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
68e0: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
68f0: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
6900: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
6910: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6920: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
6930: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
6940: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6950: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6960: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
6970: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
6980: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
69a0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
69b0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
69c0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
69d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
69e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
69f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6a00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6a10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a30: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6a40: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
6a50: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
6a60: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
6a70: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
6a80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
6a90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6aa0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6ab0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6ac0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
6ad0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6af0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6b00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
6b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6b40: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
6b50: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
6b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6b70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6b80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6b90: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
6ba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
6bc0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6bd0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
6be0: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
6bf0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
6c00: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
6c10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6c20: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
6c30: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
6c40: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
6c50: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
6c60: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
6c70: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
6c80: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
6c90: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
6ca0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
6cb0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
6cc0: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
6cd0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6ce0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
6cf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
6d00: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6d10: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
6d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d30: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
6d40: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
6d50: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
6d60: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
6d70: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
6d80: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
6d90: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
6da0: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
6db0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
6dc0: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
6dd0: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
6de0: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
6df0: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  By==0 && p->iLim
6e00: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
6e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6e20: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
6e30: 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
6e40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6e50: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
6e60: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
6e70: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
6e80: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
6e90: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
6ea0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
6eb0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
6ec0: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
6ed0: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
6ee0: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
6ef0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
6f00: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
6f30: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
6f40: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
6f50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
6f60: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6f70: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
6f80: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
6f90: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
6fa0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
6fb0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
6fc0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
6fd0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
6fe0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
6ff0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
7000: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
7010: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7020: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
7030: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
7040: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
7050: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
7060: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
7070: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
7080: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
7090: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
70a0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
70b0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
70c0: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
70d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
70e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
70f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
7100: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
7110: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
7120: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
7130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7140: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7150: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
7160: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
7170: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7180: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
7190: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
71a0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
71b0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
71c0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
71d0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
71e0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
71f0: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
7200: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
7210: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
7220: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
7230: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
7240: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
7250: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
7260: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
7270: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
7280: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
7290: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
72a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
72b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
72c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
72d0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
72e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
72f0: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
7300: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
7310: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
7320: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
7330: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7340: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
7350: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
7360: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
7370: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
7380: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
7390: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
73a0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
73b0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
73c0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
73d0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
73e0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
73f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
7400: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
7410: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
7420: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
7430: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
7440: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
7450: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
7460: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
7470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
7480: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
7490: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
74a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
74b0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
74c0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
74d0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
74e0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
74f0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
7500: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
7510: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
7520: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
7530: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
7540: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
7550: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
7560: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7570: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  st){.  int nExpr
7580: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
7590: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
75a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
75b0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
75c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
75d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
75e0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
75f0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
7600: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
7610: 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
7620: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
7630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7640: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
7650: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
7660: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
7670: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
7680: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
7690: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
76a0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
76b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
76c0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
76d0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
76e0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
76f0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
7700: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
7710: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
7720: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
7730: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7740: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
7750: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
7760: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
7770: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7780: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
7790: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
77a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
77b0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
77c0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
77d0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
77e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
77f0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
7800: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
7810: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
7820: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
7830: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
7840: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
7850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
7860: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
7870: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
7880: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
7890: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
78a0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
78b0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
78c0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
78d0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
78e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
78f0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
7900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7910: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
7920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7930: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
7940: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
7950: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
7960: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
7970: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
7980: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
7990: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
79a0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
79b0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
79c0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
79d0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
79e0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
79f0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
7a00: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
7a10: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
7a20: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
7a30: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
7a40: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
7a50: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
7a60: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
7a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7a80: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
7a90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
7aa0: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
7ab0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
7ac0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
7ad0: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
7ae0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
7af0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
7b00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7b10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
7b20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7b30: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
7b40: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
7b50: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
7b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7b80: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7b90: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7ba0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7bb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
7bc0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
7bd0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
7be0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
7bf0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
7c00: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
7c10: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
7c20: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7c30: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
7c40: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
7c50: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
7c60: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
7c70: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
7c80: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
7c90: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
7ca0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
7cb0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7cc0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
7cd0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
7ce0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
7cf0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
7d00: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
7d10: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
7d20: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
7d30: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
7d40: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
7d50: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
7d60: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
7d70: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
7d80: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
7d90: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
7da0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
7db0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
7dc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7dd0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
7de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7df0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7e00: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
7e10: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7e20: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7e30: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7e40: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7e50: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7e60: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
7e70: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7e80: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7e90: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7ea0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7eb0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
7ec0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
7ed0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
7ee0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
7ef0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7f00: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
7f10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
7f20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
7f30: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
7f40: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
7f50: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
7f60: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
7f70: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
7f80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7f90: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
7fa0: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
7fb0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
7fc0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
7fd0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
7fe0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
7ff0: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
8000: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
8010: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
8020: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
8030: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
8040: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
8050: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
8060: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
8070: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
8090: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
80a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
80b0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
80c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
80d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80e0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
80f0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
8120: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
8130: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
8140: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
8170: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
8180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8190: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
81a0: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
81b0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
81e0: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
81f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
8200: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
8210: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
8220: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
8230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
8240: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8250: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
8260: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8270: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
8280: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
8290: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
82a0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
82b0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
82c0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
82d0: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
82e0: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
82f0: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
8300: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
8310: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
8320: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
8330: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8340: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
8350: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
8360: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
8370: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
8380: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
8390: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
83a0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
83b0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
83c0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
83d0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
83e0: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
83f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
8400: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
8410: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
8420: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
8430: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
8440: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
8450: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
8460: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
8470: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
8480: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
8490: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
84a0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
84b0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
84c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
84d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
84e0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
84f0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
8500: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
8510: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
8520: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8530: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8540: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
8550: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
8560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8570: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
8580: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
8590: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
85a0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
85b0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
85c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
85d0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
85e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
85f0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
8600: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
8610: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
8620: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
8630: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
8640: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
8650: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
8660: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
8670: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
8680: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8690: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
86a0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
86b0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
86c0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
86d0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
86e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
86f0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
8700: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
8710: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
8720: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
8730: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a  Dest->iSDParm;..
8740: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
8750: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
8760: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
8770: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65  ->iECursor;.  re
8780: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
8790: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
87a0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
87b0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
87c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
87d0: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
87e0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
87f0: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
8800: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8810: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
8820: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
8830: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65  nColumn);.    re
8840: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65  gRowid = 0;.  }e
8850: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
8860: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
8870: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8880: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46   }.  if( p->selF
8890: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72  lags & SF_UseSor
88a0: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
88b0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
88c0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
88d0: 69 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61 72  int ptab2 = pPar
88e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
88f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8900: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
8910: 64 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f  do, ptab2, regSo
8920: 72 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d  rtOut, pOrderBy-
8930: 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61  >nExpr+2);.    a
8940: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
8950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8960: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
8970: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
8980: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8990: 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  , p, addrContinu
89a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
89b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
89c0: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
89d0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20  , regSortOut);. 
89e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
89f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8a00: 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72  n, ptab2, pOrder
8a10: 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
8a20: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
8a30: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8a40: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8a50: 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  HE);.  }else{.  
8a60: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
8a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8a80: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
8a90: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
8aa0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
8ab0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
8ac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8ad0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
8ae0: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
8af0: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
8b00: 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69  gRow);.  }.  swi
8b10: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
8b20: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
8b30: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
8b40: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
8b50: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8b60: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
8b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8b80: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
8b90: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
8ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8bb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
8bc0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
8bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8be0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8bf0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8c00: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
8c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8c30: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8c50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8c60: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
8c70: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
8c80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
8c90: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
8ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8cb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
8cc0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
8cd0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
8d00: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
8d10: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8d20: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8d30: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
8d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8d50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8d60: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
8d70: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
8d80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8d90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
8da0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8db0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
8dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8dd0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
8de0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
8df0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
8e00: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8e10: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
8e20: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8e30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
8e50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
8e60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
8e70: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
8e80: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
8e90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8ea0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
8eb0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
8ec0: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
8ed0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8ee0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
8ef0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8f00: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
8f10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f20: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
8f30: 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20  Sdst+i );.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8f60: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
8f70: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b  pDest->iSdst+i);
8f80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
8f90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
8fa0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8fb0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
8fc0: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
8fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8fe0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ff0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9020: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
9030: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
9040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9050: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
9060: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
9070: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
9080: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
9090: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
90b0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
90c0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
90d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
90e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
90f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9100: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
9110: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
9120: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9130: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
9140: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
9150: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
9160: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9170: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
9180: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
9190: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
91a0: 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  F_UseSorter ){. 
91b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
91d0: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
91e0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
91f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9200: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
9210: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  Tab, addr);.  }.
9220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
9230: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
9240: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65  rBreak);.  if( e
9250: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
9260: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
9270: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
9280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9290: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
92a0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
92b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
92c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
92d0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
92e0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
92f0: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
9300: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9310: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
9320: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
9330: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
9340: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
9350: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
9360: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
9370: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
9380: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
9390: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
93a0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
93b0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
93c0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
93d0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
93e0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
93f0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
9400: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
9410: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
9420: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9430: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
9440: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
9450: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
9460: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
9470: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
9480: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
9490: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
94a0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
94b0: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
94c0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
94d0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
94e0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
94f0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
9500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
9510: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
9520: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
9530: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
9540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
9550: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
9560: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
9570: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9580: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
9590: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
95a0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
95b0: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
95c0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
95d0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
95e0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
95f0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
9600: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
9610: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
9620: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
9630: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
9640: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
9650: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
9660: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
9670: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
9680: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9690: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
96a0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
96b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
96c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
96d0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
96e0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
96f0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
9700: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
9710: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
9720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9730: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
9740: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9750: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
9760: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
9770: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
9780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9790: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
97a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
97b0: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
97c0: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
97d0: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
97e0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
97f0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
9800: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
9810: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
9820: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
9830: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9840: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
9850: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9860: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9870: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
9880: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
9890: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
98a0: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
98b0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
98c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
98d0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
98e0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
98f0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9900: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9910: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
9920: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
9930: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
9940: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
9950: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
9960: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
9970: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
9980: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9990: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
99a0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
99b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
99c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
99d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
99e0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
99f0: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
9a00: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
9a10: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
9a20: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
9a30: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
9a40: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
9a50: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
9a60: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
9a70: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
9a80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
9a90: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
9ab0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
9ac0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
9ad0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
9ae0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
9af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
9b00: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
9b10: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
9b20: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
9b30: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
9b40: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
9b50: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
9b60: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
9b70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9b80: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
9b90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9ba0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9bb0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
9bc0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
9bd0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
9be0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
9bf0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
9c00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
9c10: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
9c20: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
9c30: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
9c40: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
9c50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
9c60: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
9c70: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
9c80: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
9c90: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
9ca0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
9cb0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
9cc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cd0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
9ce0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
9cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
9d00: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
9d20: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
9d30: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
9d40: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
9d50: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
9d60: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
9d70: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
9d80: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
9d90: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
9da0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
9db0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
9dc0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
9dd0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
9de0: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
9df0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
9e00: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
9e10: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
9e20: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
9e30: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
9e40: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
9e50: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
9e60: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
9e70: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
9e80: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
9e90: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
9ea0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
9eb0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
9ec0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
9ed0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
9ee0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
9ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f00: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
9f10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
9f20: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
9f30: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
9f40: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
9f50: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
9f60: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
9f70: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
9f80: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
9f90: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
9fa0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
9fb0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
9fc0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
9fd0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
9fe0: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
9ff0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
a000: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
a010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
a020: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
a030: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
a040: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
a050: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
a060: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
a070: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
a080: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
a090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0b0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
a0c0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
a0d0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
a0e0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
a0f0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
a100: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
a110: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
a120: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
a130: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
a140: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
a150: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
a160: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
a170: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
a180: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
a190: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
a1a0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
a1b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a1c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
a1d0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
a1e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
a1f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
a200: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
a210: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
a220: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
a230: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
a240: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
a250: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
a260: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
a270: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
a280: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
a290: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
a2a0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
a2b0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
a2c0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
a2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a2e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a2f0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
a300: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
a310: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
a320: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
a330: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a340: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
a350: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
a360: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a370: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
a380: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
a390: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
a3a0: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
a3b0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
a3c0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
a3d0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
a3e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a3f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
a400: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
a410: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
a420: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
a430: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
a440: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
a450: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
a460: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
a470: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
a480: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a490: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
a4a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a4b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
a4c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a4e0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
a4f0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
a500: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
a510: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a520: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a530: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a540: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a550: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
a560: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
a570: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
a580: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
a590: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
a5c0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
a5d0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
a5e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
a5f0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
a600: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
a610: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
a620: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
a630: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
a640: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
a650: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
a660: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
a670: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
a680: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
a690: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
a6a0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
a6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a6c0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a6d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a6e0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
a6f0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
a700: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
a710: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a720: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a730: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
a740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a750: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
a760: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
a770: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a780: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
a790: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
a7a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
a7b0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
a7c0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
a7d0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
a7e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a7f0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
a800: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a810: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
a820: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a830: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
a840: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
a850: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
a860: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
a870: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
a880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
a890: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
a8b0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
a8c0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a8d0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
a8e0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
a8f0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a900: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
a910: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
a920: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
a930: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
a940: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
a950: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
a960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a970: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
a980: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a990: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
a9a0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
a9b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a9c0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
a9d0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
a9e0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
a9f0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
aa00: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
aa10: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
aa20: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
aa30: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
aa40: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
aa50: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
aa60: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
aa70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
aa80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
aa90: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
aaa0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
aab0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
aac0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
aad0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
aae0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
aaf0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
ab00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ab10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ab20: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ab30: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
ab40: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ab50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
ab60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ab70: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
ab80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
ab90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aba0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
abb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
abc0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
abd0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
abe0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
abf0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
ac00: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
ac10: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
ac20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
ac30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
ac40: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
ac50: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
ac60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
ac70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ac80: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
ac90: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
aca0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
acb0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
acc0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
acd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ace0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
acf0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
ad00: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
ad10: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
ad20: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
ad30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
ad40: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
ad50: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
ad60: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
ad70: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
ad80: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
ad90: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
ada0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
adb0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
adc0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
add0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
ade0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
adf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ae00: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ae10: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
ae20: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
ae30: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ae40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ae50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ae60: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
ae70: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ae80: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
ae90: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
aea0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
aeb0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
aec0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
aed0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
aee0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
aef0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
af00: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
af10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
af20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
af30: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
af40: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
af50: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
af60: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
af70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
af80: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
af90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
afa0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
afb0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
afc0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
afd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
afe0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
aff0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
b000: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
b010: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
b020: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
b030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
b040: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
b050: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b060: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
b070: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
b080: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b090: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
b0a0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
b0b0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
b0c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
b0d0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
b0e0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
b0f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b100: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
b110: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b120: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b130: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
b140: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
b150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b160: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
b170: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
b180: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
b190: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
b1a0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
b1b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
b1c0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
b1d0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
b1e0: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
b1f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b200: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
b210: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
b220: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
b230: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
b240: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
b250: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
b260: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
b270: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b280: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
b290: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
b2a0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
b2b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b2c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
b2d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
b2e0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
b2f0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
b300: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
b310: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
b320: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
b330: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b340: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
b350: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
b360: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
b370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b380: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b390: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
b3a0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
b3b0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
b3c0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
b3d0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
b3e0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
b3f0: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
b400: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
b410: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
b420: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
b430: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
b440: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
b450: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
b460: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
b470: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
b480: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
b490: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
b4a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
b4b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
b4c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b4d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
b4e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
b4f0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
b500: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
b510: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
b520: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
b530: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
b540: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
b550: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
b560: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
b570: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
b580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b590: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
b5a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
b5b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
b5c0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
b5d0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
b5e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
b5f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
b600: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
b610: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
b620: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
b630: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
b640: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
b650: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b660: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
b670: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b680: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b690: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
b6a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
b6b0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
b6c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
b6d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
b6e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b6f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b700: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
b710: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b740: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b750: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
b760: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
b770: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
b780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
b790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
b7a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
b7b0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
b7c0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
b7d0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
b7e0: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
b7f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
b800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b810: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b820: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
b830: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
b840: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
b850: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b860: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
b870: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
b880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b890: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
b8a0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
b8b0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
b8c0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
b8d0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
b8e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
b8f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
b900: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
b910: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
b920: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
b930: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
b940: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b950: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
b960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
b970: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
b980: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
b990: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
b9a0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
b9b0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
b9c0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
b9d0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
b9e0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
b9f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ba00: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ba10: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ba20: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ba30: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ba40: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ba50: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ba60: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ba70: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
ba80: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
ba90: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
baa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bab0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
bac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bad0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
bae0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
baf0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
bb00: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
bb10: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
bb20: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
bb30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
bb40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
bb50: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
bb60: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
bb80: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
bb90: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
bba0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bbb0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
bbc0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bbd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
bbe0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
bbf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bc00: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
bc10: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
bc20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bc30: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
bc40: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
bc50: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
bc60: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
bc70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
bc80: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
bc90: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
bca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bcc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
bcd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bce0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bd00: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
bd10: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
bd20: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
bd30: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
bd40: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
bd50: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
bd60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
bd70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bd80: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
bd90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
bda0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
bdb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
bdc0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
bdd0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
bde0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
bdf0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
be00: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
be10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
be20: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
be30: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
be40: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
be50: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
be60: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
be70: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
be80: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
be90: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
bea0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
beb0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
bec0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
bed0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
bee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
bef0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
bf00: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
bf10: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
bf20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
bf30: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
bf40: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
bf50: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
bf60: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
bf70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bf80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bf90: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
bfa0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
bfb0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
bfc0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
bfd0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
bfe0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
bff0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
c000: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
c010: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
c020: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
c030: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
c040: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
c050: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
c060: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
c070: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
c080: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
c090: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
c0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c0b0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c0c0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
c0d0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
c0e0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
c0f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
c100: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
c110: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
c120: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
c130: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
c140: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
c150: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
c160: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
c170: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c180: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c190: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
c1a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c1b0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
c1c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
c1d0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
c1e0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
c1f0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
c200: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c210: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
c220: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
c230: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
c240: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
c250: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
c260: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
c270: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
c280: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
c290: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
c2a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
c2b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
c2c0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
c2d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
c2e0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
c2f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c300: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
c310: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
c320: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
c330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
c340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c350: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c360: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
c370: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
c390: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
c3a0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
c3b0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
c3c0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
c3d0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
c3e0: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
c3f0: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
c400: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
c410: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
c420: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c430: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
c440: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
c450: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
c470: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
c480: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
c490: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
c4a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
c4b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
c4c0: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
c4d0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
c4e0: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
c4f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
c500: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
c510: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
c520: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
c530: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
c540: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c550: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
c560: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
c570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c580: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c590: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c5a0: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
c5b0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
c5c0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
c5d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
c5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
c5f0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
c600: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
c610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c620: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
c630: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
c640: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
c650: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
c670: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
c680: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
c690: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
c6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
c6e0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
c6f0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
c700: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
c710: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
c720: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
c730: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
c740: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
c750: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
c760: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
c770: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
c780: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
c790: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
c7a0: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
c7b0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
c7c0: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
c7d0: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
c7e0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
c7f0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
c800: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
c810: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
c820: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
c830: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
c840: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
c850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c860: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
c870: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
c880: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c890: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c8a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
c8b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
c8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
c8d0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
c8e0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
c8f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
c900: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c910: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
c920: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
c930: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
c940: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
c950: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c960: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
c970: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
c980: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
c990: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
c9a0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
c9b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9c0: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
c9d0: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
c9e0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
c9f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
ca00: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
ca10: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
ca20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
ca30: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
ca40: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
ca50: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
ca60: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
ca70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ca80: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
ca90: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
caa0: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
cab0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
cac0: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
cad0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
cae0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
caf0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cb00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
cb10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
cb20: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
cb30: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
cb40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
cb50: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
cb60: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
cb70: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
cb80: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
cb90: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
cba0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
cbb0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
cbc0: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
cbd0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
cbe0: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
cbf0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
cc00: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
cc10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
cc20: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
cc30: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
cc40: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
cc50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
cc60: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
cc70: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
cc80: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
cc90: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
cca0: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
ccb0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
ccc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
ccd0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
cce0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ccf0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
cd00: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
cd10: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
cd20: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
cd30: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
cd40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
cd50: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
cd60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
cd70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cd80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
cd90: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
cda0: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
cdb0: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
cdc0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
cdd0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
cde0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cdf0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ce00: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ce10: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ce20: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ce30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ce40: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ce50: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ce60: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ce70: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ce80: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ce90: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
cea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ceb0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
cec0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ced0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
cee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cef0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
cf00: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cf10: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
cf20: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
cf30: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
cf40: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
cf50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
cf60: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
cf70: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
cf80: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
cf90: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
cfa0: 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
cfb0: 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c  576;.  selectCol
cfc0: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
cfd0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
cfe0: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
cff0: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
d000: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
d010: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
d020: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
d030: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
d040: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
d050: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
d060: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d070: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
d080: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
d090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d0a0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
d0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
d0c0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
d0d0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
d0e0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
d0f0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
d100: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
d110: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
d120: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
d130: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d140: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
d150: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
d160: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
d170: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d180: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
d190: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
d1a0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
d1b0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
d1c0: 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
d1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d1e0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
d1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d200: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
d210: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
d220: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
d230: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
d240: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
d250: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
d260: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
d270: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d280: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d290: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
d2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d2b0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
d2c0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d2d0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
d2e0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
d2f0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
d300: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
d310: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
d320: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
d330: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
d340: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
d350: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
d360: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
d370: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
d380: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
d390: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
d3a0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
d3b0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
d3c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
d3d0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
d3e0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
d3f0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
d400: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
d410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d420: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
d430: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
d440: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
d450: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
d460: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d470: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
d480: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
d490: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
d4a0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
d4b0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
d4c0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
d4d0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
d4e0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
d4f0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
d500: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
d510: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
d520: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
d530: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
d540: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
d550: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
d560: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
d570: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
d580: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
d590: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
d5a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
d5b0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
d5c0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
d5d0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
d5e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
d5f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
d600: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d610: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d620: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
d630: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
d640: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
d650: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
d660: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
d670: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
d680: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
d690: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
d6a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
d6b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
d6c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
d6d0: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
d6e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
d6f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
d700: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
d710: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
d720: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
d730: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
d740: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
d750: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
d760: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
d770: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
d780: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
d790: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
d7a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
d7b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
d7c0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
d7d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d7e0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
d7f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d800: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d810: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
d820: 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20   /* VDBE should 
d830: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d840: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
d850: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d860: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
d870: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
d880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d8a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
d8b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d8c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
d8d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
d8e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d900: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d910: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
d920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
d930: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
d940: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
d950: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
d960: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
d970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d990: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
d9a0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
d9d0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
d9e0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d9f0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
da00: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
da10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da20: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
da30: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
da40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
da50: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
da60: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
da70: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
da80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
da90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
daa0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
dab0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
dac0: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
dad0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
dae0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
daf0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
db00: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
db10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
db20: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
db30: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
db40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
db50: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
db60: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
db70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
db80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
db90: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
dba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dbb0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
dbc0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
dbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dbe0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dbf0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dc10: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
dc20: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
dc30: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
dc40: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
dc50: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
dc60: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
dc70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc80: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
dc90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dcb0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
dcc0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
dcd0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dce0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
dcf0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
dd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
dd10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
dd20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dd30: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
dd40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
dd50: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
dd60: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
dd70: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
dd80: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
dd90: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
dda0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
ddb0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
ddc0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
ddd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dde0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
ddf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
de00: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
de10: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
de20: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
de30: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
de40: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
de50: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
de60: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
de70: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
de80: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
de90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
dea0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
deb0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
dec0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
ded0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
dee0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
def0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
df00: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
df10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
df20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
df30: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
df40: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
df50: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
df60: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
df70: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
df80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
df90: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
dfa0: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
dfb0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
dfc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
dfd0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
dfe0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
dff0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
e000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
e010: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
e020: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e030: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e040: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e050: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
e070: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
e080: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
e090: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e0a0: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
e0b0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
e0c0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
e0d0: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
e0e0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e0f0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
e100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e110: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
e120: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
e130: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
e140: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
e150: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
e160: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
e170: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
e180: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
e190: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
e1a0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
e1b0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
e1c0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
e1d0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
e1e0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
e1f0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
e200: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
e210: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
e220: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
e230: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
e240: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
e250: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
e260: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
e270: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
e280: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e290: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
e2a0: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
e2b0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
e2c0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
e2d0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
e2e0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
e2f0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
e300: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
e310: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
e320: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
e330: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
e340: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
e350: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
e360: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
e370: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e380: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
e390: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
e3a0: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
e3b0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
e3c0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
e3d0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
e3e0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
e3f0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
e400: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
e410: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
e420: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
e430: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
e440: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
e450: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
e460: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
e470: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
e480: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
e490: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
e4a0: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
e4b0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
e4c0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
e4d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
e4e0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
e4f0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
e500: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
e510: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
e520: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
e530: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
e540: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
e550: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
e560: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
e570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e580: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e590: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e5a0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
e5c0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
e5d0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
e5e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
e5f0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
e600: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
e610: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
e620: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e630: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
e640: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
e650: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
e660: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
e670: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
e680: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
e690: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
e6a0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e6d0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
e6e0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
e6f0: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
e700: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
e710: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
e720: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
e730: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
e740: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
e750: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
e760: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
e770: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e780: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
e790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
e7a0: 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
e7b0: 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
e7c0: 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
e7d0: 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
e7e0: 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
e7f0: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
e800: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
e810: 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
e820: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e830: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
e840: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
e850: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
e860: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
e870: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
e880: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
e890: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
e8a0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
e8b0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
e8d0: 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
e8e0: 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
e8f0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
e900: 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
e910: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
e920: 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
e930: 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
e940: 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
e950: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
e960: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
e970: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
e980: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
e990: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
e9a0: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
e9b0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
e9c0: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
e9d0: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
e9e0: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
e9f0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
ea00: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ea10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ea20: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
ea30: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
ea40: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
ea50: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
ea60: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
ea70: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
ea80: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
ea90: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
eaa0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
eab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
eac0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
ead0: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
eae0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
eaf0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
eb00: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
eb10: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
eb20: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
eb30: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
eb40: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
eb50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
eb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
eb70: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
eb80: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
eb90: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
eba0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
ebb0: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
ebc0: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
ebd0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
ebe0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
ebf0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
ec00: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
ec10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
ec20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ec30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ec40: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
ec50: 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
ec60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
ec70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ec80: 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
ec90: 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
eca0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
ecb0: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
ecc0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
ecd0: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
ece0: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
ecf0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
ed00: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
ed10: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
ed20: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
ed30: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
ed40: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
ed50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
ed60: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
ed70: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
ed80: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
ed90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
eda0: 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ues ){.      sql
edb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
edc0: 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
edd0: 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
ede0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
edf0: 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rms");.    }else
ee00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ee10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ee20: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
ee30: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
ee40: 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20  f %s".        " 
ee50: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
ee60: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
ee70: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
ee80: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ee90: 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op));.    }.    
eea0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
eeb0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
eec0: 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  d;.  }..#ifndef 
eed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
eee0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
eef0: 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  a recursive quer
ef00: 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
ef10: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
ef20: 42 59 20 6f 72 0a 20 20 2a 2a 20 4c 49 4d 49 54  BY or.  ** LIMIT
ef30: 20 63 6c 61 75 73 65 2e 20 4e 65 69 74 68 65 72   clause. Neither
ef40: 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 73 75   of these are su
ef50: 70 70 6f 72 74 65 64 2e 20 20 2a 2f 0a 20 20 61  pported.  */.  a
ef60: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
ef70: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
ef80: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  t );.  if( (p->s
ef90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
efa0: 75 72 73 69 76 65 29 20 26 26 20 28 70 2d 3e 70  ursive) && (p->p
efb0: 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4c  OrderBy || p->pL
efc0: 69 6d 69 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  imit) ){.    sql
efd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
efe0: 72 73 65 2c 20 22 25 73 20 69 6e 20 61 20 72 65  rse, "%s in a re
eff0: 63 75 72 73 69 76 65 20 71 75 65 72 79 20 69 73  cursive query is
f000: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 2c 0a 20   not allowed",. 
f010: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
f020: 42 79 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20  By ? "ORDER BY" 
f030: 3a 20 22 4c 49 4d 49 54 22 0a 20 20 20 20 29 3b  : "LIMIT".    );
f040: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
f050: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
f060: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
f070: 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
f080: 65 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  e ){.    SrcList
f090: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
f0a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
f0b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f0c0: 72 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  r;.    int addrN
f0d0: 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  ext;.    int add
f0e0: 72 53 77 61 70 3b 0a 20 20 20 20 69 6e 74 20 69  rSwap;.    int i
f0f0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a 20 20  Cont, iBreak;.  
f100: 20 20 69 6e 74 20 74 6d 70 31 3b 20 20 20 20 20    int tmp1;     
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 2f 2a 20 49 6e 74 65 72 6d 65 64 69 61 74 65 20  /* Intermediate 
f130: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
f140: 20 74 6d 70 32 3b 20 20 20 20 20 20 20 20 20 20   tmp2;          
f150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
f160: 78 74 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  xt intermediate 
f170: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
f180: 20 74 6d 70 33 20 3d 20 30 3b 20 20 20 20 20 20   tmp3 = 0;      
f190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
f1a0: 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
f1b0: 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
f1c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 65 44 65 73 74  */.    int eDest
f1d0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
f1e0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 74 6d 70    SelectDest tmp
f1f0: 32 64 65 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  2dest;.    int i
f200: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
f210: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
f220: 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52  se, SQLITE_RECUR
f230: 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29  SIVE, 0, 0, 0) )
f240: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  {.      goto mul
f250: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f260: 20 20 20 7d 0a 20 20 20 20 69 42 72 65 61 6b 20     }.    iBreak 
f270: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f280: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
f290: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
f2a0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f2b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  .    for(i=0; AL
f2c0: 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
f2d0: 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c); i++){.      
f2e0: 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  if( pSrc->a[i].i
f2f0: 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
f300: 20 20 20 20 20 20 74 6d 70 31 20 3d 20 70 53 72        tmp1 = pSr
f310: 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
f320: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f340: 20 20 20 74 6d 70 32 20 3d 20 70 50 61 72 73 65     tmp2 = pParse
f350: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
f360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
f370: 4e 20 29 7b 0a 20 20 20 20 20 20 65 44 65 73 74  N ){.      eDest
f380: 20 3d 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65   = SRT_DistTable
f390: 3b 0a 20 20 20 20 20 20 74 6d 70 33 20 3d 20 70  ;.      tmp3 = p
f3a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f3b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f3c0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f3d0: 74 6d 70 32 64 65 73 74 2c 20 65 44 65 73 74 2c  tmp2dest, eDest,
f3e0: 20 74 6d 70 32 29 3b 0a 0a 20 20 20 20 73 71 6c   tmp2);..    sql
f3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f400: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
f410: 61 6c 2c 20 74 6d 70 31 2c 20 6e 43 6f 6c 29 3b  al, tmp1, nCol);
f420: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f430: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
f440: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 32  nEphemeral, tmp2
f450: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , nCol);.    if(
f460: 20 74 6d 70 33 20 29 7b 0a 20 20 20 20 20 20 70   tmp3 ){.      p
f470: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
f480: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
f490: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f4a0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 33 2c  Ephemeral, tmp3,
f4b0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65   0);.      p->se
f4c0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
f4d0: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
f4e0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  }..    /* Store 
f4f0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
f500: 68 65 20 69 6e 69 74 69 61 6c 20 53 45 4c 45 43  he initial SELEC
f510: 54 20 69 6e 20 74 6d 70 32 2e 20 2a 2f 0a 20 20  T in tmp2. */.  
f520: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
f530: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
f540: 69 6f 72 2c 20 26 74 6d 70 32 64 65 73 74 29 3b  ior, &tmp2dest);
f550: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
f560: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f570: 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65  end;..    /* Cle
f580: 61 72 20 74 6d 70 31 2e 20 54 68 65 6e 20 73 77  ar tmp1. Then sw
f590: 69 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  itch the content
f5a0: 73 20 6f 66 20 74 6d 70 31 20 61 6e 64 20 74 6d  s of tmp1 and tm
f5b0: 70 32 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  p2. Then return 
f5c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74  .    ** the cont
f5d0: 65 6e 74 73 20 6f 66 20 74 6d 70 31 20 74 6f 20  ents of tmp1 to 
f5e0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 4f 72 2c 20  the caller. Or, 
f5f0: 69 66 20 74 6d 70 31 20 69 73 20 65 6d 70 74 79  if tmp1 is empty
f600: 20 61 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   at this.    ** 
f610: 70 6f 69 6e 74 2c 20 74 68 65 20 72 65 63 75 72  point, the recur
f620: 73 69 76 65 20 71 75 65 72 79 20 68 61 73 20 66  sive query has f
f630: 69 6e 69 73 68 65 64 20 2d 20 6a 75 6d 70 20 74  inished - jump t
f640: 6f 20 61 64 64 72 65 73 73 20 69 42 72 65 61 6b  o address iBreak
f650: 2e 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 53 77  .  */.    addrSw
f660: 61 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ap = sqlite3Vdbe
f670: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 77 61  AddOp2(v, OP_Swa
f680: 70 43 75 72 73 6f 72 73 2c 20 74 6d 70 31 2c 20  pCursors, tmp1, 
f690: 74 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  tmp2);.    sqlit
f6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f6b0: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 6d 70 31 2c  OP_Rewind, tmp1,
f6c0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 61 64   iBreak);.    ad
f6d0: 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
f6e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f6f0: 76 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e  v);.    selectIn
f700: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
f710: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 6d  p, p->pEList, tm
f720: 70 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  p1, p->pEList->n
f730: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 30 2c  Expr,.        0,
f740: 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
f750: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  , iBreak);.    s
f760: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f770: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
f780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f790: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f7a0: 78 74 2c 20 74 6d 70 31 2c 20 61 64 64 72 4e 65  xt, tmp1, addrNe
f7b0: 78 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 65  xt);..    /* Exe
f7c0: 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
f7d0: 76 65 20 53 45 4c 45 43 54 2e 20 53 74 6f 72 65  ve SELECT. Store
f7e0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
f7f0: 74 6d 70 32 2e 20 57 68 69 6c 65 20 74 68 69 73  tmp2. While this
f800: 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 69  .    ** SELECT i
f810: 73 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 20 63  s running, the c
f820: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 6d 70 31 20  ontents of tmp1 
f830: 61 72 65 20 72 65 61 64 20 62 79 20 72 65 63 75  are read by recu
f840: 72 73 69 76 65 20 0a 20 20 20 20 2a 2a 20 72 65  rsive .    ** re
f850: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
f860: 63 75 72 72 65 6e 74 20 43 54 45 2e 20 20 2a 2f  current CTE.  */
f870: 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
f880: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
f890: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f8a0: 65 2c 20 70 2c 20 26 74 6d 70 32 64 65 73 74 29  e, p, &tmp2dest)
f8b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
f8c0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
f8d0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
f8e0: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63  rior;.    if( rc
f8f0: 20 29 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65   ) goto multi_se
f900: 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 73  lect_end;..    s
f910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f920: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f930: 61 64 64 72 53 77 61 70 29 3b 0a 20 20 20 20 73  addrSwap);.    s
f940: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f950: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
f960: 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
f970: 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
f980: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
f990: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
f9a0: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
f9b0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
f9c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
f9d0: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
f9e0: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
f9f0: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
fa00: 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
fa10: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
fa20: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
fa30: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
fa40: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
fa50: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
fa60: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
fa70: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
fa80: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
fa90: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
faa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
fab0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
fac0: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
fad0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
fae0: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
faf0: 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
fb00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
fb10: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
fb20: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
fb30: 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
fb40: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
fb50: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
fb60: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
fb70: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
fb80: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
fb90: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
fba0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
fbb0: 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
fbc0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
fbd0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
fbe0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
fbf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fc00: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
fc20: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
fc30: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
fc40: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
fc50: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
fc60: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
fc70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
fc80: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
fc90: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
fca0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fcb0: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
fcc0: 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
fcd0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
fce0: 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
fcf0: 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
fd00: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
fd10: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
fd20: 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
fd30: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
fd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fd50: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
fd60: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
fd70: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
fd80: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
fd90: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
fda0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
fdb0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
fdc0: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
fdd0: 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
fde0: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
fdf0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
fe00: 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
fe10: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
fe20: 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
fe30: 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
fe40: 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
fe50: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
fe60: 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
fe70: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
fe80: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
fe90: 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
fea0: 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
feb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fec0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fed0: 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
fee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
ff00: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
ff10: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
ff20: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
ff30: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
ff40: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
ff50: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
ff60: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
ff70: 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
ff80: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
ff90: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
ffa0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
ffb0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
ffc0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
ffd0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ffe0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
fff0: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
10000 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
10010 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
10020 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
10030 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
10040 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
10050 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
10060 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
10070 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
10080 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
10090 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
100a0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
100b0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
100c0 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
100d0 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
100e0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
100f0 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59  priorOp && ALWAY
10100 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21  S(!p->pLimit &&!
10110 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
10120 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
10130 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
10140 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
10150 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
10160 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
10170 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
10180 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
10190 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
101a0 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f  !=p );  /* Can o
101b0 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c  nly happen for l
101c0 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
101d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d        ** of a 3-
10200 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70  way or more comp
10210 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
10220 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
10230 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
10240 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
10250 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
10260 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
10270 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
10280 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
10290 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
102a0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
102b0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
102c0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
102d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
102e0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
102f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
10300 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
10310 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
10320 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
10330 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
10340 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
10350 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
10360 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10370 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
10380 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
10390 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
103a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
103b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
103c0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
103d0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
103e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
103f0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
10400 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
10410 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
10420 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
10430 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73  p->pRightmost->s
10440 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
10450 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
10460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10470 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
10480 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
10490 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
104a0 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
104b0 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
104c0 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
104d0 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
104e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
104f0 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
10500 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
10510 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
10520 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
10530 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
10540 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
10550 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10560 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10570 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
10580 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  ndest);.      if
10590 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
105a0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
105b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
105c0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
105d0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
105e0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
105f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
10600 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
10610 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  {.        op = S
10620 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
10630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10640 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
10650 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
10660 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
10670 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
10680 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
10690 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
106a0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
106b0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
106c0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
106d0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
106e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
106f0 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
10700 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
10710 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
10720 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
10730 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
10740 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
10750 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10760 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
10770 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
10780 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
10790 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
107a0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
107b0 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
107c0 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
107d0 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
107e0 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
107f0 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
10800 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
10810 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
10820 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
10830 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10840 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
10850 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
10860 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
10870 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
10880 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
10890 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
108a0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
108b0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
108c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
108d0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
108e0 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
108f0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
10900 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
10910 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
10920 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
10930 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10940 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
10950 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
10960 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
10970 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
10980 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
10990 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
109a0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
109b0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
109c0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
109d0 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
109e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
109f0 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
10a00 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
10a10 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
10a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
10a30 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
10a40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
10a50 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
10a60 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
10a70 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
10a80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
10a90 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
10aa0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
10ab0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
10ac0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
10ad0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
10ae0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
10af0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
10b00 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
10b10 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
10b20 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
10b30 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
10b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10b50 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
10b60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10b70 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
10b80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10b90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
10ba0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
10bb0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
10bc0 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10be0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10bf0 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
10c00 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
10c10 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
10c20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10c30 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
10c40 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
10c50 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
10c60 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
10c70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
10ca0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
10cb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10cc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10cd0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
10ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10cf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10d00 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
10d10 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
10d20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10d30 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
10d40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d60 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
10d70 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
10d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10d90 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  }.    default: a
10da0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
10db0 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a  _INTERSECT ); {.
10dc0 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
10dd0 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
10de0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
10df0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
10e00 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
10e10 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
10e20 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
10e30 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
10e40 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  est;.      int r
10e50 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  1;..      /* INT
10e60 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
10e70 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
10e80 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
10e90 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
10ea0 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
10eb0 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
10ec0 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
10ed0 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
10ee0 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
10ef0 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
10f00 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
10f10 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
10f20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
10f30 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
10f40 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10f50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
10f60 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  erBy==0 );..    
10f70 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10f90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10fa0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
10fb0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10fc0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
10fd0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
10fe0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
10ff0 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
11000 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61  ightmost->selFla
11010 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
11020 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73  emeral;.      as
11030 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
11040 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
11050 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
11060 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
11070 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
11080 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
11090 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
110a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
110b0 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
110c0 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
110d0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
110e0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
110f0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
11100 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
11110 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
11120 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
11130 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
11140 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
11150 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
11160 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11180 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
11190 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
111a0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
111b0 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
111c0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
111d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
111e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
111f0 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
11200 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
11210 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
11220 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
11230 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
11240 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
11250 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
11260 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
11270 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
11280 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
11290 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
112a0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
112b0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
112c0 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
112d0 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  iSDParm = tab2;.
112e0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
112f0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
11300 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
11310 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
11320 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11330 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
11340 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
11350 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
11360 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
11370 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
11380 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
11390 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
113a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
113b0 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
113c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
113d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
113e0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
113f0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
11400 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
11410 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
11420 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
11430 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
11440 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
11450 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
11460 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
11470 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
11480 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
11490 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
114a0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
114c0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
114d0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
114e0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
114f0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
11500 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
11510 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
11520 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
11530 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
11540 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
11550 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
11560 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
11570 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
11580 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
11590 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
115a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
115b0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
115c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
115d0 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
115e0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
115f0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
11600 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
11610 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11620 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
11630 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
11640 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
11650 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
11660 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
11670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11680 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
11690 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
116a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
116b0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
116c0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
116d0 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   r1, 0);.      s
116e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
116f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11700 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
11710 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
11720 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
11730 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
11740 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
11750 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
11760 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
11770 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
11780 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11790 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
117a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
117b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
117c0 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
117d0 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
117e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
117f0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
11800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
11820 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
11830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11840 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
11850 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
11860 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11870 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
11880 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
11890 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
118a0 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
118b0 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
118c0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
118d0 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
118e0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
118f0 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
11900 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
11910 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
11920 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
11930 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
11940 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
11950 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
11960 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
11970 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
11980 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
11990 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
119a0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
119b0 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
119c0 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
119d0 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
119e0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
119f0 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
11a00 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
11a10 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
11a20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
11a30 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
11a40 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
11a50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11a60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
11a70 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
11a80 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11ab0 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
11ac0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
11ad0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
11ae0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
11af0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
11b00 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
11b10 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
11b20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11b30 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
11b40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
11b50 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
11b60 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
11b70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11b80 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
11b90 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
11ba0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11bd0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
11be0 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
11bf0 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
11c00 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f  st==p );.    nCo
11c10 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
11c20 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
11c30 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
11c40 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
11c50 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
11c60 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
11c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11c80 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
11c90 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
11ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
11cb0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
11cc0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
11cd0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
11ce0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
11cf0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
11d00 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11d10 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
11d20 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
11d30 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
11d40 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
11d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11d60 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
11d70 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
11d80 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
11d90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
11da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
11db0 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
11dc0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
11dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
11de0 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
11df0 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
11e00 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
11e10 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
11e20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
11e30 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
11e40 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
11e50 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
11e60 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
11e70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
11e80 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
11e90 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
11ea0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
11eb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11ed0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
11ee0 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
11ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11f00 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
11f10 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
11f20 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
11f30 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
11f60 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
11f70 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
11f80 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
11f90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
11fa0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
11fb0 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
11fc0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
11fd0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
11fe0 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
11ff0 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
12000 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
12010 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
12020 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
12030 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
12040 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12050 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
12060 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
12070 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
12080 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
12090 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
120a0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
120b0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
120c0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
120d0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
120e0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
120f0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
12100 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
12110 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
12120 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
12130 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
12140 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
12150 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
12160 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12170 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
12180 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
12190 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
121a0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
121b0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
121c0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
121d0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
121e0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
121f0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
12200 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
12210 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
12220 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
12230 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
12240 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
12250 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
12260 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
12270 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
12280 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
12290 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
122a0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
122b0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
122c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
122d0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
122e0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
122f0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
12300 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
12310 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
12320 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12330 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
12340 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12350 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12360 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12370 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12380 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
12390 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
123a0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
123b0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
123c0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
123d0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
123e0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
123f0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
12400 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
12410 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
12420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12430 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
12440 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
12450 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
12460 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
12470 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
12480 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
12490 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
124a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
124b0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
124c0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
124d0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
124e0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
124f0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
12500 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
12510 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
12520 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12530 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
12540 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
12550 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
12560 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
12570 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
12580 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
12590 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
125a0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
125b0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
125c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
125d0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
125e0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
125f0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
12600 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
12610 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12620 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
12630 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
12640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12650 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
12660 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
12670 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
12680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
126b0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
126c0 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
126d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
126e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
126f0 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
12700 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
12710 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12720 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
12730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12740 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
12750 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
12760 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
12770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12780 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12790 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
127a0 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
127b0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
127c0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
127d0 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
127e0 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
127f0 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
12800 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
12810 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
12820 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
12830 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
12840 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
12850 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
12860 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
12870 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
12880 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
12890 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
128a0 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
128b0 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
128c0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
128d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
128e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
128f0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
12900 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12910 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
12920 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
12930 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
12940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12950 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
12960 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
12970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12980 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
12990 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
129a0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
129b0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
129c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
129d0 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
129e0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
129f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
12a10 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
12a20 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
12a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12a40 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12a50 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
12a60 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12a70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12a80 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
12a90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12aa0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
12ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12ac0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12ad0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12ae0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
12af0 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
12b00 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
12b10 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
12b20 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
12b30 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
12b40 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
12b50 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
12b60 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
12b70 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
12b80 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
12b90 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
12ba0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
12bb0 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
12bc0 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
12bd0 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
12be0 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  1 );.      pDest
12bf0 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
12c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
12c10 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
12c20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
12c30 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
12c40 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
12c50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12c60 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
12c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c80 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
12c90 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
12ca0 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
12cb0 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
12cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12cd0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
12ce0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
12cf0 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
12d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d10 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
12d20 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
12d30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
12d40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12d50 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
12d60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12d70 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
12d80 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
12d90 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
12da0 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
12db0 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
12dc0 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
12dd0 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
12de0 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
12df0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
12e00 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
12e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e20 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
12e30 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
12e40 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
12e50 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
12e60 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
12e70 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
12e80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12e90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
12ea0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
12eb0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
12ec0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
12ed0 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
12ee0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
12ef0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
12f00 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
12f10 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
12f20 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
12f30 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
12f40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
12f50 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
12f60 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
12f70 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st==1 );.      s
12f80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
12f90 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
12fa0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
12fb0 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
12fc0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
12fd0 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
12fe0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
12ff0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
13000 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
13010 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
13020 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13030 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
13040 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
13050 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
13060 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
13070 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
13080 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
13090 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
130a0 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
130b0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
130c0 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
130d0 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
130e0 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
130f0 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
13100 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13110 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
13120 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
13130 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
13140 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
13150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13160 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
13170 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
13180 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
13190 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29  t, pDest->nSdst)
131a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
131b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
131c0 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
131d0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
131e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
131f0 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
13200 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
13210 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
13220 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
13230 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
13240 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13250 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
13260 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
13270 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
13280 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
13290 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
132a0 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
132b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
132c0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
132d0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
132e0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
132f0 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
13300 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
13310 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
13320 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
13330 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
13340 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
13350 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
13360 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
13370 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
13380 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13390 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
133a0 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
133b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
133c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
133d0 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
133e0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
133f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13400 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
13410 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
13420 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
13430 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
13440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13450 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
13460 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
13470 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
13480 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
13490 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
134a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
134b0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp3(v, OP_IfZer
134c0 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
134d0 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a  reak, -1);.  }..
134e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
134f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
13500 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
13510 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13520 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
13530 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13540 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
13550 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
13560 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
13570 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
13580 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
13590 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
135a0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
135b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
135c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
135d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
135e0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
135f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
13600 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
13610 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
13620 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
13630 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
13640 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
13650 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
13660 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
13670 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
13680 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
13690 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
136a0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
136b0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
136c0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
136d0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
136e0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
136f0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
13700 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
13710 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
13720 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
13730 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
13740 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
13750 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
13760 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
13770 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
13780 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
13790 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
137a0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
137b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
137c0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
137d0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
137e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
137f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
13800 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
13810 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
13820 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
13830 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
13840 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
13850 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
13860 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
13870 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
13880 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
13890 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
138a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
138b0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
138c0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
138d0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
138e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
138f0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
13900 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
13910 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
13920 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
13930 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
13940 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
13950 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
13960 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13970 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
13980 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
13990 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
139a0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
139b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
139c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
139d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
139e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
139f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
13a00 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
13a10 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
13a20 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
13a30 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
13a40 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
13a50 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
13a60 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
13a70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
13a80 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
13a90 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
13aa0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
13ab0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
13ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
13ad0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
13ae0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
13af0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
13b00 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
13b10 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
13b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
13b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13b60 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
13b70 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
13b80 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
13b90 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
13ba0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
13bb0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
13bc0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
13bd0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
13be0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
13bf0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
13c00 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
13c10 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
13c20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
13c30 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
13c40 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
13c50 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
13c60 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
13c70 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
13c80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
13c90 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
13ca0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
13cb0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
13cc0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
13cd0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
13ce0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
13cf0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
13d00 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
13d10 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
13d20 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
13d30 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
13d40 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
13d50 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
13d60 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
13d70 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
13d80 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
13d90 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
13da0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
13db0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
13dc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
13dd0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
13de0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
13df0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
13e00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
13e10 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
13e20 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
13e30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
13e40 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
13e50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
13e60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
13e70 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
13e80 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
13e90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
13ea0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
13eb0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
13ec0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
13ed0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
13ee0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
13ef0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
13f00 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
13f10 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
13f20 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
13f30 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
13f40 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
13f50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
13f60 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
13f70 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
13f80 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
13f90 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
13fa0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
13fb0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
13fc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
13fd0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
13fe0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
13ff0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
14000 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
14010 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
14020 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
14030 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
14040 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
14050 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
14060 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
14070 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
14080 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
14090 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
140a0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
140b0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
140c0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
140d0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
140e0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
140f0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
14100 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
14110 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
14120 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
14130 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
14140 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
14150 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
14160 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
14170 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
14180 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
14190 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
141a0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
141b0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
141c0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
141d0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
141e0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
141f0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
14200 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
14210 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
14220 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
14230 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
14240 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
14250 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
14260 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
14270 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
14280 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
14290 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
142a0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
142b0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
142c0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
142d0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
142e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
142f0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
14300 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
14310 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
14320 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14330 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14340 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14350 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
14360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
14370 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
14380 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
14390 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
143a0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
143b0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
143c0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
143d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
143e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
143f0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
14400 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
14410 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
14420 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
14430 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
14440 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
14450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
14460 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
14470 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
14480 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
14490 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
144a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
144b0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
144c0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
144d0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
144e0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
144f0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
14500 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
14510 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
14520 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
14530 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
14540 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fA;          /* 
14550 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
14560 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69   when select-A i
14570 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
14580 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
14590 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
145a0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
145b0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
145c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66   */.  int regEof
145d0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  B;          /* F
145e0 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
145f0 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73  when select-B is
14600 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69   complete */.  i
14610 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
14620 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14630 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
14640 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
14650 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
14660 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14670 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
14680 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
14690 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
146a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
146b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
146c0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
146d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
146e0 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
146f0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
14700 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
14710 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
14720 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
14730 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
14740 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
14750 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
14760 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
14770 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
14780 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
14790 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
147a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
147b0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
147c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
147d0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
147e0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
147f0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20    int addrEofB; 
14800 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14810 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
14820 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -B-exhausted sub
14830 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
14840 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20   addrAltB;      
14850 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14860 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74   the A<B subrout
14870 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
14880 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f  rAeqB;         /
14890 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
148a0 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65   A==B subroutine
148b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67   */.  int addrAg
148c0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
148d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e  ddress of the A>
148e0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
148f0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b    int regLimitA;
14900 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
14910 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
14920 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
14930 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20  regLimitB;      
14940 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
14950 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
14960 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
14970 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  v;          /* A
14980 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
14990 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76  ers to hold prev
149a0 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ious output */. 
149b0 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b   int savedLimit;
149c0 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
149d0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d  value of p->iLim
149e0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  it */.  int save
149f0 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  dOffset;      /*
14a00 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
14a10 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->iOffset */.  
14a20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20  int labelCmpr;  
14a30 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
14a40 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
14a50 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  the merge algori
14a60 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  thm */.  int lab
14a70 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  elEnd;         /
14a80 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
14a90 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61  end of the overa
14aa0 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a  ll SELECT stmt *
14ab0 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
14ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
14ad0 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  p instructions t
14ae0 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74  hat get retarget
14af0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ted */.  int op;
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b10 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c  * One of TK_ALL,
14b20 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
14b30 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45  CEPT, TK_INTERSE
14b40 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  CT */.  KeyInfo 
14b50 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a  *pKeyDup = 0; /*
14b60 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
14b70 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  rmation for dupl
14b80 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f  icate removal */
14b90 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
14ba0 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70  Merge;   /* Comp
14bb0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
14bc0 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72  on for merging r
14bd0 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
14be0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
14bf0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
14c00 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
14c10 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
14c20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
14c30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
14c40 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
14c50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14c60 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
14c70 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14c80 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
14c90 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
14ca0 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59  ng from ORDER BY
14cb0 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74   terms to result
14cc0 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   set columns */.
14cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ce0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
14cf0 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20  t iSub1;        
14d00 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
14d10 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
14d20 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b   */.  int iSub2;
14d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
14d40 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
14d50 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
14d60 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
14d70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
14d80 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
14d90 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
14da0 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
14db0 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
14dc0 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
14dd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
14de0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14df0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
14e00 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
14e10 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
14e20 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
14e30 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
14e40 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
14e50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14e60 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
14e70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14e80 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
14e90 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
14ea0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
14eb0 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
14ec0 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
14ed0 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
14ee0 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
14ef0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
14f00 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
14f10 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
14f20 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
14f30 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
14f40 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
14f50 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
14f60 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
14f70 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
14f80 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
14f90 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14fa0 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
14fb0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
14fc0 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
14fd0 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
14fe0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14ff0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
15000 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
15010 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
15020 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
15030 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
15040 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
15050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
15060 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15070 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
15080 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
15090 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
150a0 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
150b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
150c0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
150d0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
150e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
150f0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
15100 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
15110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15120 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
15130 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
15140 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
15150 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
15160 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
15170 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
15180 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15190 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
151a0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
151b0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
151c0 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
151d0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
151e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
151f0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
15200 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
15210 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
15220 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
15230 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
15240 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
15250 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
15260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15270 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
15280 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
15290 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
152a0 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
152b0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
152c0 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
152d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
152e0 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
152f0 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
15300 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
15310 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
15320 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
15330 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
15340 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
15350 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
15360 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
15370 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
15380 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
15390 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
153a0 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
153b0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
153c0 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
153d0 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
153e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
153f0 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
15400 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  nOrderBy);.  if(
15410 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
15420 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15430 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
15440 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
15450 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
15460 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
15470 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
15480 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
15490 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
154a0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74            && pIt
154b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
154c0 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
154d0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
154e0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
154f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
15500 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
15510 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 73     pKeyMerge = s
15520 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
15530 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2c  oc(db, nOrderBy,
15540 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
15550 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  yMerge ){.      
15560 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
15570 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
15580 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
15590 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  l;.        Expr 
155a0 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
155b0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
155c0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
155d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
155e0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
155f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15600 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
15610 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
15620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15630 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
15640 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
15650 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72  (pParse, p, aPer
15660 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  mute[i]);.      
15670 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
15680 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
15690 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
156a0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
156b0 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
156c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
156d0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
156e0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
156f0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
15700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15710 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15720 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
15730 65 61 62 6c 65 28 70 4b 65 79 4d 65 72 67 65 29  eable(pKeyMerge)
15740 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
15750 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  Merge->aColl[i] 
15760 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
15770 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
15780 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
15790 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
157a0 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
157b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
157c0 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
157d0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
157e0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
157f0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
15800 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
15810 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
15820 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
15830 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
15840 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
15850 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
15860 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
15870 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
15880 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
15890 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
158a0 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
158b0 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
158c0 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
158d0 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
158e0 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
158f0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
15900 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
15910 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
15920 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
15930 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
15940 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
15950 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15960 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
15970 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
15980 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
15990 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
159a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
159b0 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
159c0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
159d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
159e0 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
159f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15a00 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15a10 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
15a20 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
15a30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
15a40 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
15a50 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
15a60 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
15a70 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
15a80 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
15a90 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
15aa0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
15ab0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
15ac0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
15ad0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
15ae0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
15af0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
15b00 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
15b10 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
15b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
15b30 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
15b40 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
15b50 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
15b60 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
15b70 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
15b80 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
15b90 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
15ba0 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
15bb0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
15bc0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
15bd0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
15be0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
15bf0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
15c00 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
15c10 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
15c20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
15c30 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
15c40 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
15c50 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
15c60 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
15c70 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
15c80 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
15c90 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
15ca0 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
15cb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15cc0 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
15cd0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15cf0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
15d00 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
15d10 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
15d20 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
15d50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15d60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15d70 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
15d80 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
15d90 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
15da0 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
15db0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
15dc0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
15dd0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
15de0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
15df0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15e00 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
15e10 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
15e20 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
15e30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15e40 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b  ;.  regEofA = ++
15e50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15e60 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
15e70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
15e80 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofB = ++pParse-
15e90 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
15ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15eb0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
15ec0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15ed0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15ee0 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
15ef0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
15f00 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
15f10 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15f20 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
15f30 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
15f40 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61  );..  /* Jump pa
15f50 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  st the various s
15f60 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63  ubroutines and c
15f70 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65  oroutines to the
15f80 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65   main.  ** merge
15f90 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20   loop.  */.  j1 
15fa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15fb0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
15fc0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
15fd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15fe0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20  entAddr(v);...  
15ff0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
16000 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
16010 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
16020 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
16030 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
16040 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
16050 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
16060 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
16070 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
16080 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
16090 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
160a0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
160b0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
160c0 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
160d0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
160e0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
160f0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
16100 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16110 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
16120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16130 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16140 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 1, regEofA);. 
16150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16160 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16170 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62  regAddrA);.  Vdb
16180 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16190 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
161a0 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
161b0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
161c0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
161d0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
161e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
161f0 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
16200 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
16210 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
16220 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
16230 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16240 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  v);.  VdbeNoopCo
16250 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
16260 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
16270 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
16280 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
16290 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
162a0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
162b0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
162c0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
162d0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
162e0 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
162f0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
16300 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
16310 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
16320 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
16330 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
16340 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
16350 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
16360 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
16370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16380 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16390 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 1, regEofB);.
163a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163b0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
163c0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64   regAddrB);.  Vd
163d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
163e0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
163f0 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
16400 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
16410 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
16420 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
16430 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
16440 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
16450 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
16460 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
16470 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
16480 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
16490 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
164a0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
164b0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
164c0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
164d0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
164e0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
164f0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
16500 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
16510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16520 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
16530 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
16540 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
16550 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
16560 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
16570 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
16580 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
16590 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
165a0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
165b0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
165c0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
165d0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
165e0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
165f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
16600 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
16610 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
16620 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
16630 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
16640 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
16650 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
16660 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
16670 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
16680 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
16690 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
166a0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
166b0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
166c0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
166d0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
166e0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
166f0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
16700 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
16710 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
16720 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
16730 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
16740 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16750 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
16760 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
16770 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
16780 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
16790 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
167a0 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
167b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
167c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
167d0 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  lEnd);.  }else{ 
167e0 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d   .    addrEofA =
167f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16800 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16810 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
16820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16830 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16840 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
16850 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69  rOutB);.    sqli
16860 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16870 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16880 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drB);.    sqlite
16890 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
168a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
168b0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
168c0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
168d0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
168e0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
168f0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
16900 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
16910 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
16920 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
16930 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
16940 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
16950 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
16960 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
16970 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
16980 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
16990 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
169a0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
169b0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
169c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
169d0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
169e0 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
169f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
16a00 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
16a10 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
16a20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
16a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16a40 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
16a50 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
16a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
16a80 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
16a90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16aa0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
16ab0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
16ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
16ae0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
16af0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16b00 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
16b10 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
16b20 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
16b30 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
16b40 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
16b50 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
16b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16b70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16b80 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
16b90 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
16ba0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
16bb0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
16bc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16bd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
16be0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
16bf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16c00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
16c10 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
16c20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
16c30 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
16c40 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
16c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
16c60 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
16c70 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
16c80 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
16c90 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
16ca0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
16cb0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
16cc0 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
16cd0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
16ce0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
16cf0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
16d00 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
16d10 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
16d20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
16d30 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
16d40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16d50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
16d60 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
16d70 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fA);.    sqlite3
16d80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16d90 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
16da0 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
16db0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16dc0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
16dd0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
16de0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16df0 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
16e00 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
16e10 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
16e20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16e30 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
16e40 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
16e50 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
16e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16e70 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
16e80 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
16e90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16ea0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
16eb0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73  , regAddrB);.  s
16ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16ed0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
16ee0 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  fB, addrEofB);. 
16ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f00 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16f10 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
16f20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
16f30 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
16f40 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
16f50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16f60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16f70 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
16f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16f90 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
16fa0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
16fb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16fc0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
16fd0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
16fe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16ff0 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20  osub, regAddrA, 
17000 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
17010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17020 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
17030 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c  egAddrB, addrSel
17040 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectB);.  sqlite3
17050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17060 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
17070 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
17080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17090 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
170a0 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a  addrEofB);..  /*
170b0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
170c0 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
170d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
170e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
170f0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
17100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17110 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
17120 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
17130 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
17140 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
17150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17160 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
17170 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
17180 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
17190 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
171a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
171b0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
171c0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
171d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
171e0 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
171f0 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
17200 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
17210 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
17220 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
17230 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  B);..  /* Jump t
17240 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
17250 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
17260 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
17270 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17280 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17290 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
172a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
172b0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
172c0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
172d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
172e0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
172f0 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
17300 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
17310 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
17320 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
17330 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
17340 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
17350 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
17360 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
17370 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
17380 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
17390 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
173a0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
173b0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
173c0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
173d0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
173e0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
173f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17400 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
17410 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
17420 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17430 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
17440 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
17450 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
17460 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
17470 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
17480 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
17490 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
174a0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
174b0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
174c0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
174d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
174e0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
174f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17500 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
17510 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
17520 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
17530 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
17540 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
17550 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
17560 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
17570 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
17580 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
17590 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
175a0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
175b0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
175c0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
175d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
175e0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
175f0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
17600 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
17610 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
17620 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
17630 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
17640 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
17650 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
17660 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
17670 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
17680 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
17690 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
176a0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
176b0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
176c0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
176d0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
176e0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
176f0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
17700 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
17710 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
17720 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
17730 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
17740 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
17750 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
17760 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
17770 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
17780 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
17790 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
177a0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
177b0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
177c0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
177d0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
177e0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
177f0 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
17800 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
17810 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
17820 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
17830 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
17840 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
17850 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
17860 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
17870 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
17880 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
17890 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
178a0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
178b0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
178c0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
178d0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
178e0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
178f0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
17900 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
17910 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
17920 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
17930 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17940 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
17950 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
17960 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
17970 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
17980 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
17990 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
179a0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
179b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
179c0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
179d0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
179e0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
179f0 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
17a00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17a10 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
17a20 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
17a30 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
17a40 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
17a50 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
17a60 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
17a70 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
17a80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17a90 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
17aa0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
17ab0 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
17ac0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
17ad0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
17ae0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
17af0 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
17b00 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
17b10 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
17b20 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
17b30 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
17b40 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
17b50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17b60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
17b70 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
17b80 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
17b90 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
17ba0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17bc0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17bd0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
17be0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17bf0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
17c00 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
17c10 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
17c20 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
17c30 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
17c40 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
17c50 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
17c60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
17c70 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
17c80 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
17c90 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
17ca0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
17cb0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
17cc0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17cd0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
17ce0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
17cf0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
17d00 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
17d10 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
17d20 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17d30 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
17d40 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
17d50 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
17d60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
17d70 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
17d80 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
17d90 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17da0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
17db0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
17dc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17dd0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
17de0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
17df0 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
17e00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
17e10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17e20 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
17e30 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
17e40 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
17e50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
17e60 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
17e70 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
17e80 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
17e90 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
17ea0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
17eb0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
17ec0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17ed0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
17ee0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
17ef0 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
17f00 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
17f10 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17f20 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
17f30 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
17f40 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
17f50 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
17f60 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
17f70 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
17f80 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
17f90 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
17fa0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
17fb0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17fc0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
17fd0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
17fe0 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
17ff0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
18000 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
18010 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
18020 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
18030 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
18040 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
18050 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
18060 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
18070 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
18080 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
18090 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
180a0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
180b0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
180c0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
180d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
180e0 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
180f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
18100 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
18110 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
18120 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
18130 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18140 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
18150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18160 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
18170 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
18180 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
18190 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
181a0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
181b0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
181c0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
181d0 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
181e0 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
181f0 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
18200 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18210 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
18220 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
18230 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
18240 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
18250 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
18260 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
18270 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
18280 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
18290 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
182a0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
182b0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
182c0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
182d0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
182e0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
182f0 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
18300 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
18310 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
18320 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
18330 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
18340 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
18350 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
18360 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
18370 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
18380 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
18390 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
183a0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
183b0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
183c0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
183d0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
183e0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
183f0 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
18400 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
18410 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18420 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
18430 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
18440 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
18450 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
18460 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
18470 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
18480 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
18490 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
184a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
184b0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
184c0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
184d0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
184e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
184f0 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
18500 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
18510 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
18520 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
18530 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
18540 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
18550 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
18560 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
18570 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
18580 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
18590 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
185a0 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
185b0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
185c0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
185d0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
185e0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
185f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
18600 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
18610 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
18620 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
18630 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
18640 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
18650 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
18660 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
18670 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
18680 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
18690 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
186a0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
186b0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
186c0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
186d0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
186e0 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
186f0 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
18700 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
18710 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
18720 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
18730 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
18740 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
18750 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
18760 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
18770 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
18780 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
18790 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
187a0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
187b0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
187c0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
187d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
187e0 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
187f0 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
18800 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
18810 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
18820 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
18830 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
18840 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
18850 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
18860 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18870 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
18880 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
18890 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
188a0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
188b0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
188c0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
188d0 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
188e0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
188f0 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
18900 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
18910 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
18920 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
18930 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
18940 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
18950 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
18960 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
18970 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
18980 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
18990 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
189a0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
189b0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
189c0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
189d0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
189e0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
189f0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
18a00 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
18a10 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
18a20 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
18a30 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
18a40 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
18a50 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
18a60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18a70 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
18a80 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
18a90 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
18aa0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
18ab0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
18ac0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
18ad0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
18ae0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
18af0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
18b00 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
18b10 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
18b20 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
18b30 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
18b40 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
18b50 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
18b60 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
18b70 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
18b80 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
18b90 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
18ba0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
18bb0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
18bc0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
18bd0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
18be0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
18bf0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
18c00 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
18c10 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
18c20 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
18c30 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
18c40 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
18c50 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
18c60 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
18c70 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
18c80 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
18c90 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
18ca0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
18cb0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
18cc0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
18cd0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
18ce0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
18cf0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
18d00 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
18d10 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
18d20 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
18d30 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
18d40 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
18d50 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
18d60 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
18d70 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
18d80 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
18d90 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
18da0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
18db0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
18dc0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
18dd0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
18de0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
18df0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
18e00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
18e10 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
18e20 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
18e30 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
18e40 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
18e50 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
18e60 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
18e70 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
18e80 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
18e90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
18ea0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
18eb0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
18ec0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
18ed0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
18ee0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
18ef0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
18f00 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
18f10 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
18f20 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
18f30 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
18f40 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
18f50 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
18f60 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
18f70 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
18f80 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
18f90 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
18fa0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
18fb0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
18fc0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
18fd0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
18fe0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
18ff0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
19000 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
19010 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
19020 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
19030 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
19040 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
19050 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
19060 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
19070 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
19080 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
19090 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
190a0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
190b0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
190c0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
190d0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
190e0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
190f0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
19100 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
19110 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
19120 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
19130 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
19140 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
19150 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
19160 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
19170 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
19180 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
19190 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
191a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
191b0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
191c0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
191d0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
191e0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
191f0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
19200 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
19210 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
19220 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
19230 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
19240 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
19250 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
19260 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19270 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
19280 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
19290 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
192a0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
192b0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
192c0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
192d0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
192e0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
192f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
19300 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
19310 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
19320 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
19330 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
19340 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
19350 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
19360 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19370 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
19380 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
19390 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
193a0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
193b0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
193c0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
193d0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
193e0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
193f0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
19400 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
19410 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
19420 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
19430 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
19440 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
19450 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
19460 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
19470 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
19480 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
19490 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
194a0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
194b0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
194c0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
194d0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
194e0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
194f0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
19500 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
19510 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
19520 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
19530 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
19540 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
19550 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
19560 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
19570 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
19580 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
19590 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
195a0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
195b0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
195c0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
195d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
195e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
195f0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
19600 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
19610 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
19620 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
19630 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
19640 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
19650 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
19660 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
19670 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
19680 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
19690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
196a0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
196b0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
196c0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
196d0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
196e0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
196f0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
19700 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19710 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
19720 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
19730 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
19740 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
19750 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
19760 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
19770 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
19780 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
19790 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
197a0 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
197b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
197c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
197d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
197e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
197f0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
19800 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
19810 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
19820 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
19830 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
19840 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
19850 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
19860 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
19870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19880 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
19890 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
198a0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
198b0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
198c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
198d0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
198e0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
198f0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
19900 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
19910 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
19920 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19930 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
19940 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
19950 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
19960 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
19970 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
19980 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
19990 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
199a0 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
199b0 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
199c0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
199d0 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
199e0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
199f0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
19a00 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
19a10 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
19a20 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
19a30 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
19a40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
19a50 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
19a60 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
19a70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
19a80 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
19a90 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
19aa0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
19ab0 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
19ac0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
19ad0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19af0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
19b00 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b20 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19b30 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19b40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
19b50 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
19b60 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
19b70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19b80 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
19b90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
19ba0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
19bb0 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
19bc0 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
19bd0 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
19be0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
19bf0 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
19c00 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
19c10 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
19c20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
19c30 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
19c40 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
19c50 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
19c60 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
19c70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
19c80 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
19c90 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
19ca0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
19cb0 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
19cc0 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
19cd0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
19ce0 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
19cf0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
19d00 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
19d10 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
19d20 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
19d30 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19d60 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
19d70 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
19d80 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
19d90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19da0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19db0 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
19dc0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
19dd0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
19de0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
19df0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
19e00 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
19e10 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
19e20 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
19e30 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
19e40 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
19e50 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
19e60 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
19e70 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
19e80 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
19e90 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
19ea0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
19eb0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
19ec0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
19ed0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
19ee0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
19ef0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
19f00 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
19f10 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
19f20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
19f30 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
19f40 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
19f50 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19f60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19f70 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
19f80 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
19f90 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19fc0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
19fd0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
19fe0 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
19ff0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1a000 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a040 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1a050 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1a060 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a090 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1a0a0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1a0b0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1a0c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1a0d0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a0e0 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1a0f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1a100 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1a110 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1a120 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1a130 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1a140 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1a150 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1a160 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1a170 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1a180 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1a190 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1a1a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1a1b0 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1a1c0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1a1d0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1a1e0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1a1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a220 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1a230 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1a240 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1a250 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a280 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1a290 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1a2a0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1a2b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a2c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a2d0 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1a2e0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1a2f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1a300 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1a310 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1a320 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1a330 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1a340 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1a350 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1a360 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
1a370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1a380 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a  triction (22)  *
1a390 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1a3a0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1a3b0 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1a3c0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
1a3d0 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20         /* (23)  
1a3e0 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
1a3f0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1a400 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1a410 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1a420 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1a430 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1a440 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1a450 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1a460 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1a470 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1a480 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1a490 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1a4a0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1a4b0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1a4c0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1a4d0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1a4e0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1a4f0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1a500 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1a510 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1a520 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1a530 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1a540 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1a550 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1a560 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1a570 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1a580 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1a590 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1a5a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1a5b0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1a5c0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1a5d0 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1a5e0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1a5f0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1a600 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1a610 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1a620 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1a630 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1a640 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1a650 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1a660 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1a670 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1a680 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1a690 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1a6a0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1a6b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1a6c0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1a6d0 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1a6e0 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1a6f0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1a700 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1a710 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1a720 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1a730 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1a740 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1a750 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1a760 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1a770 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1a780 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1a790 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1a7a0 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1a7b0 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1a7c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1a7d0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1a7e0 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1a7f0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1a800 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1a810 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1a820 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1a830 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1a840 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1a850 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1a860 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1a870 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1a880 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1a890 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1a8a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a8b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1a8c0 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1a8d0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1a8e0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1a8f0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1a900 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1a910 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1a920 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1a930 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1a940 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1a950 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1a960 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1a970 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1a980 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1a990 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1a9a0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1a9b0 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1a9c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1a9d0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1a9e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1a9f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1aa00 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1aa10 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1aa20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1aa30 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1aa40 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1aa50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1aa60 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1aa70 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1aa80 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1aa90 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1aaa0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1aab0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1aac0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1aad0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1aae0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1aaf0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1ab00 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1ab10 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1ab20 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1ab30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ab40 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1ab50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1ab60 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1ab70 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1ab80 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1ab90 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1aba0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1abb0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1abc0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1abd0 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1abe0 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1abf0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1ac00 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1ac10 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1ac20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1ac30 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1ac40 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1ac50 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1ac60 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1ac70 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1ac80 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1ac90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1aca0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1acb0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1acc0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1acd0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1ace0 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1acf0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1ad00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1ad10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ad20 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1ad30 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1ad40 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1ad50 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1ad60 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1ad70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1ad80 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1ad90 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1ada0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1adb0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1adc0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1add0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1ade0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1adf0 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1ae00 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1ae10 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1ae20 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1ae30 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1ae40 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1ae50 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1ae60 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1ae70 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1ae80 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1ae90 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1aea0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1aeb0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1aec0 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1aed0 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1aee0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1aef0 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1af00 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1af10 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1af20 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1af30 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1af40 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1af50 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1af60 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1af70 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1af80 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1af90 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1afa0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1afb0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1afc0 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1afd0 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1afe0 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1aff0 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1b000 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1b010 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1b020 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1b030 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1b040 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1b050 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1b060 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1b070 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1b080 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1b090 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1b0a0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1b0b0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1b0c0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1b0d0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1b0e0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1b0f0 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1b100 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1b110 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1b120 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1b130 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1b140 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1b150 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1b160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1b170 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1b180 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1b190 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1b1a0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1b1b0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1b1c0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1b1d0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1b1e0 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1b1f0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1b200 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1b210 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1b220 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1b230 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1b240 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1b250 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1b260 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1b270 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1b280 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1b290 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1b2a0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1b2b0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1b2c0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1b2d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1b2e0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1b2f0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1b300 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1b310 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1b320 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1b330 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1b340 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1b350 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1b360 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1b370 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1b380 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1b390 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1b3a0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1b3b0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1b3c0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1b3d0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1b3e0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1b3f0 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1b400 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1b410 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1b420 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1b430 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1b440 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1b450 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
1b460 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e   = 0;.    if( pN
1b470 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1b480 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  New = pPrior;.  
1b490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b4a0 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
1b4b0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  rior;.      pNew
1b4c0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
1b4d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
1b4e0 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
1b4f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b500 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1b510 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
1b520 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
1b530 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
1b540 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b550 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
1b560 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1b570 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
1b580 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
1b590 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
1b5a0 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
1b5b0 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1b5c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1b5d0 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1b5e0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1b5f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1b600 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1b610 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1b620 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1b630 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
1b640 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1b650 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
1b660 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
1b670 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
1b680 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1b690 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
1b6a0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
1b6b0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
1b6c0 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
1b6d0 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
1b6e0 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
1b6f0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1b700 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
1b710 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1b720 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
1b730 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
1b740 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
1b750 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
1b760 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
1b770 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1b780 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
1b790 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
1b7a0 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
1b7b0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1b7c0 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
1b7d0 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
1b7e0 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
1b7f0 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
1b800 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
1b810 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
1b820 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1b830 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
1b840 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
1b850 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
1b860 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
1b870 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1b880 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1b890 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1b8a0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
1b8b0 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
1b8c0 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1b8d0 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
1b8e0 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
1b8f0 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
1b900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
1b910 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
1b920 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
1b930 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
1b940 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1b950 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
1b960 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
1b970 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
1b980 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
1b990 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
1b9a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
1b9b0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1b9c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
1b9d0 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
1b9e0 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
1b9f0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1ba00 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1ba10 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
1ba20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
1ba30 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1ba40 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
1ba50 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
1ba60 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1ba70 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1ba80 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1ba90 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1baa0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1bab0 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
1bac0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
1bad0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
1bae0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1baf0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
1bb00 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
1bb10 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
1bb20 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
1bb30 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
1bb40 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
1bb50 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
1bb60 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
1bb70 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
1bb80 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
1bb90 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
1bba0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
1bbb0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1bbc0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1bbd0 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1bbe0 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1bbf0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
1bc00 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
1bc10 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
1bc20 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
1bc30 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
1bc40 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
1bc50 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1bc60 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
1bc70 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
1bc80 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
1bc90 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1bca0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1bcb0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
1bcc0 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
1bcd0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
1bce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1bcf0 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
1bd00 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1bd10 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1bd20 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
1bd30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1bd40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1bd50 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
1bd60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bd70 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
1bd80 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
1bd90 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1bda0 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
1bdb0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
1bdc0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1bdd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bde0 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1bdf0 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1be00 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1be10 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1be20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1be30 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1be40 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1be50 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1be60 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1be70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1be80 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1be90 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1bea0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1beb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1bec0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1bed0 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1bee0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bef0 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1bf00 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1bf10 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1bf20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1bf30 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1bf40 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1bf50 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1bf60 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1bf70 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1bf80 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1bf90 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1bfa0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1bfb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1bfc0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1bfd0 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1bfe0 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1bff0 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1c000 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1c010 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1c020 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1c030 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1c040 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1c050 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1c060 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1c070 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1c080 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1c090 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1c0a0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1c0b0 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1c0c0 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1c0d0 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1c0e0 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1c0f0 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1c100 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1c110 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1c120 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1c130 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1c140 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1c150 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1c160 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1c170 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1c180 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1c190 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1c1a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1c1b0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1c1c0 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1c1d0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1c1e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c1f0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1c200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c210 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1c220 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c230 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1c240 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1c250 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1c260 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1c270 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1c280 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1c290 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1c2a0 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1c2b0 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1c2c0 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1c2d0 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1c2e0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1c2f0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1c300 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1c310 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1c320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1c330 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
1c340 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
1c350 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
1c360 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
1c370 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
1c380 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
1c390 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
1c3a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
1c3b0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
1c3c0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1c3d0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
1c3e0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1c3f0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
1c400 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
1c410 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
1c420 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
1c430 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
1c440 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1c450 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1c460 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1c470 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
1c480 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
1c490 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1c4a0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1c4b0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1c4c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c4d0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
1c4e0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
1c4f0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1c500 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c510 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1c520 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
1c530 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
1c540 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
1c550 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
1c560 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1c570 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
1c580 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
1c590 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
1c5a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1c5b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c5c0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1c5d0 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
1c5e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1c5f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
1c600 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
1c610 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1c620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1c630 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
1c640 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1c650 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1c660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c670 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c680 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
1c690 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
1c6a0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1c6b0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
1c6c0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c6d0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1c6e0 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
1c6f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1c700 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1c710 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1c720 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1c730 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1c740 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c750 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c760 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1c770 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c780 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1c790 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1c7a0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1c7b0 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1c7c0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1c7d0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1c7e0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1c7f0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1c800 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1c810 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1c820 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1c830 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c850 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1c860 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1c870 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1c880 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1c890 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c8a0 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1c8b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c8c0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1c8d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c8e0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1c8f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1c900 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1c910 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1c920 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c930 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1c940 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c950 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1c960 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1c970 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1c980 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1c990 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1c9a0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1c9b0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1c9c0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1ca00 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1ca10 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1ca20 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1ca30 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1ca40 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1ca50 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1ca60 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1ca70 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1ca80 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1ca90 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1caa0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1cab0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1cac0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1cad0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1cae0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1caf0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1cb00 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1cb10 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1cb20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1cb30 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1cb40 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1cb50 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1cb60 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1cb70 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1cb80 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1cb90 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1cba0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1cbb0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1cbc0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1cbd0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1cbe0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1cbf0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1cc00 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1cc10 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1cc20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1cc30 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1cc40 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1cc50 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1cc60 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
1cc70 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
1cc80 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
1cc90 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
1cca0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
1ccb0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ccc0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1ccd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
1cce0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
1ccf0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
1cd00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1cd10 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1cd20 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1cd30 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1cd40 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1cd50 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1cd60 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1cd70 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
1cd80 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1cd90 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1cda0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1cdb0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1cdc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1cdd0 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
1cde0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1cdf0 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
1ce00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
1ce10 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1ce20 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
1ce30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1ce40 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
1ce50 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1ce60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
1ce70 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
1ce80 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
1ce90 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1cea0 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
1ceb0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1cec0 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
1ced0 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
1cee0 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
1cef0 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
1cf00 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1cf10 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
1cf20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
1cf30 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
1cf40 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
1cf50 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1cf60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1cf70 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1cf80 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
1cf90 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
1cfa0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1cfb0 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
1cfc0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1cfd0 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
1cfe0 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
1cff0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
1d000 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
1d010 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
1d020 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
1d030 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
1d040 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
1d050 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
1d060 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
1d070 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
1d080 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
1d090 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
1d0a0 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
1d0b0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1d0c0 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
1d0d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1d0e0 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
1d0f0 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
1d100 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
1d110 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
1d120 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
1d130 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
1d140 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
1d150 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
1d160 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1d170 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
1d180 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1d190 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
1d1a0 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
1d1b0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1d1c0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
1d1d0 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
1d1e0 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
1d1f0 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
1d200 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
1d210 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1d220 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1d230 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
1d240 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1d250 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1d260 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
1d270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1d280 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1d290 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
1d2a0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1d2b0 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
1d2c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1d2d0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
1d2e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1d2f0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1d300 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
1d310 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1d320 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1d330 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1d340 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
1d350 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
1d360 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
1d370 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
1d380 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
1d390 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1d3a0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1d3b0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
1d3c0 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
1d3d0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
1d3e0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
1d3f0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
1d400 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
1d410 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
1d420 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
1d430 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
1d440 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1d450 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
1d460 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
1d470 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
1d480 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
1d490 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
1d4a0 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
1d4b0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
1d4c0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
1d4d0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
1d4e0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1d4f0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
1d500 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
1d510 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1d520 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
1d530 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
1d540 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
1d550 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
1d560 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
1d570 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
1d580 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
1d590 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
1d5a0 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
1d5b0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
1d5c0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
1d5d0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
1d5e0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
1d5f0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
1d600 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1d610 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
1d620 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
1d630 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
1d640 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1d650 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
1d660 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
1d670 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
1d680 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
1d690 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
1d6a0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1d6b0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1d6c0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
1d6d0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
1d6e0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
1d6f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1d700 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1d710 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
1d720 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
1d730 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
1d740 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1d750 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
1d760 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1d770 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
1d780 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
1d790 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1d7a0 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
1d7b0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
1d7c0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
1d7d0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
1d7e0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
1d7f0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
1d800 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
1d810 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
1d820 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
1d830 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
1d840 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
1d850 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
1d860 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
1d870 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
1d880 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
1d890 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
1d8a0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
1d8b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1d8c0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
1d8d0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1d8e0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
1d8f0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
1d900 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
1d910 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1d920 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
1d930 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
1d940 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1d950 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
1d960 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
1d970 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
1d980 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1d990 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1d9a0 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
1d9b0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1d9c0 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
1d9d0 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
1d9e0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1d9f0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
1da00 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
1da10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1da20 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1da30 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
1da40 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
1da50 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1da60 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
1da70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1da80 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
1da90 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
1daa0 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
1dab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
1dac0 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
1dad0 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1dae0 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
1daf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1db00 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
1db10 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
1db20 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
1db30 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
1db40 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
1db50 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1db60 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
1db70 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
1db80 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
1db90 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
1dba0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
1dbb0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
1dbc0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
1dbd0 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
1dbe0 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
1dbf0 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
1dc00 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
1dc10 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1dc20 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
1dc30 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
1dc40 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1dc50 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
1dc60 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
1dc70 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
1dc80 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1dc90 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
1dca0 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
1dcb0 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
1dcc0 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
1dcd0 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
1dce0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
1dcf0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
1dd00 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
1dd10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1dd20 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
1dd30 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1dd40 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
1dd50 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
1dd60 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1dd70 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
1dd80 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
1dd90 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
1dda0 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
1ddb0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
1ddc0 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
1ddd0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1dde0 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
1ddf0 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
1de00 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
1de10 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
1de20 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
1de30 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
1de40 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
1de50 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1de60 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1de70 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1de80 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
1de90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
1dea0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1deb0 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
1dec0 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
1ded0 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
1dee0 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
1def0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
1df00 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1df10 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
1df20 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
1df30 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1df40 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
1df50 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
1df60 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
1df70 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
1df80 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
1df90 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
1dfa0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1dfb0 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
1dfc0 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
1dfd0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
1dfe0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1dff0 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
1e000 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1e010 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
1e020 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
1e030 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1e040 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
1e050 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1e060 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
1e070 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1e080 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
1e090 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1e0a0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
1e0b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e0c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1e0d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1e0e0 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
1e0f0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1e100 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1e110 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
1e120 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
1e130 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
1e140 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1e150 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1e160 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
1e170 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
1e180 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
1e190 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1e1a0 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
1e1b0 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
1e1c0 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
1e1d0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
1e1e0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1e1f0 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
1e200 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  r(db, TK_ALL, 0)
1e210 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
1e220 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
1e230 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
1e240 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
1e250 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
1e260 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
1e270 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
1e280 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  Prior = 0;.  pNe
1e290 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
1e2a0 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
1e2b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
1e2c0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69  _Continue;.}..#i
1e2d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e2e0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75  T_CTE./*.** Argu
1e2f0 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63  ment pWith (whic
1e300 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70  h may be NULL) p
1e310 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65  oints to a linke
1e320 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64  d list of nested
1e330 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78   .** WITH contex
1e340 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74  ts, from inner t
1e350 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20  o outermost. If 
1e360 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
1e370 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d  fied by .** FROM
1e380 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
1e390 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20  pItem is really 
1e3a0 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65  a common-table-e
1e3b0 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20  xpression (CTE) 
1e3c0 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
1e3d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e3e0 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20   CTE definition 
1e3f0 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20  for that table. 
1e400 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74  Otherwise.** ret
1e410 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
1e420 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
1e430 73 65 61 72 63 68 57 69 74 68 28 57 69 74 68 20  searchWith(With 
1e440 2a 70 57 69 74 68 2c 20 73 74 72 75 63 74 20 53  *pWith, struct S
1e450 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1e460 65 6d 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  em){.  const cha
1e470 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
1e480 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1e490 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
1e4a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
1e4b0 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
1e4c0 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
1e4d0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
1e4e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1e4f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1e500 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
1e510 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1e520 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
1e530 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
1e540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e550 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
1e560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e580 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
1e590 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1e5a0 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
1e5b0 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
1e5c0 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
1e5d0 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
1e5e0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
1e5f0 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
1e600 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
1e610 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1e620 65 73 20 70 75 73 68 20 61 6e 64 20 70 75 6c 6c  es push and pull
1e630 20 57 49 54 48 20 63 6c 61 75 73 65 73 20 6f 6e   WITH clauses on
1e640 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76   the stack..*/.v
1e650 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
1e660 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
1e670 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b  e, With *pWith){
1e680 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
1e690 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
1e6a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
1e6b0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
1e6c0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
1e6d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1e6e0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1e6f0 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
1e700 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
1e710 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
1e720 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
1e730 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
1e740 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
1e750 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
1e760 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
1e770 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
1e780 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
1e790 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
1e7a0 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
1e7b0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
1e7c0 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
1e7d0 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
1e7e0 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
1e7f0 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
1e800 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
1e810 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
1e820 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
1e830 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
1e840 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
1e850 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
1e860 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
1e870 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
1e880 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
1e890 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
1e8a0 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
1e8b0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1e8c0 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
1e8d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1e8e0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
1e8f0 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
1e900 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
1e910 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
1e920 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
1e930 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
1e940 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
1e950 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
1e960 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
1e970 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e980 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
1e990 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
1e9a0 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
1e9b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1e9c0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
1e9d0 62 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b;.  Parse *pPar
1e9e0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1e9f0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
1ea00 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ea10 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
1ea20 70 43 74 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCte;..  assert(
1ea30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
1ea40 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
1ea50 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
1ea60 70 57 69 74 68 2c 20 70 46 72 6f 6d 29 3b 0a 20  pWith, pFrom);. 
1ea70 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
1ea80 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1ea90 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1eaa0 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
1eab0 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
1eac0 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
1ead0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1eae0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
1eaf0 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
1eb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1eb10 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
1eb20 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
1eb30 4c 4c 5d 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  LL] */..    /* I
1eb40 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20  f pCte->zErr is 
1eb50 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
1eb60 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
1eb70 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
1eb80 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
1eb90 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
1eba0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
1ebb0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
1ebc0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
1ebd0 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
1ebe0 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c  e->zErr is NULL,
1ebf0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
1ec00 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
1ec10 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
1ec20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
1ec30 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
1ec40 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b  f( pCte->zErr ){
1ec50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1ec60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
1ec70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d  Cte->zErr, pCte-
1ec80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
1ec90 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1eca0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 72 6f  .    }..    pFro
1ecb0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1ecc0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1ecd0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ece0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
1ecf0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1ed00 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1ed10 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
1ed20 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
1ed30 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1ed40 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 74 65  f(db, "%s", pCte
1ed50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
1ed60 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
1ed70 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73      pTab->nRowEs
1ed80 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20  t = 1048576;.   
1ed90 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1eda0 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1edb0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  .    pFrom->pSel
1edc0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
1edd0 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d  ectDup(db, pCte-
1ede0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
1edf0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ee00 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1ee10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ee20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1ee30 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20  >pSelect );..   
1ee40 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
1ee50 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  s is a recursive
1ee60 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65   CTE. */.    pSe
1ee70 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1ee80 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75  ct;.    bMayRecu
1ee90 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e  rsive = ( pSel->
1eea0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
1eeb0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
1eec0 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79   );.    if( bMay
1eed0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
1eee0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1eef0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
1ef00 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pFrom->pSelect->
1ef10 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
1ef20 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
1ef30 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
1ef40 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ef50 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1ef60 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1ef70 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
1ef80 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20  atabase==0 .    
1ef90 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a       && pItem->z
1efa0 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20  Name!=0 .       
1efb0 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
1efc0 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  trICmp(pItem->zN
1efd0 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  ame, pCte->zName
1efe0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
1eff0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1f000 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
1f010 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73         pItem->is
1f020 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
1f030 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
1f040 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
1f050 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
1f060 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
1f070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f080 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f090 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
1f0a0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
1f0b0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
1f0c0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
1f0d0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
1f0e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
1f0f0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
1f100 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
1f110 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
1f120 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
1f130 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
1f140 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f150 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1f160 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
1f170 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28  ab->nRef==1 || (
1f180 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
1f190 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
1f1a0 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29   pTab->nRef==2 )
1f1b0 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45  );..    pCte->zE
1f1c0 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
1f1d0 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
1f1e0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1f1f0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d  lect(pWalker, bM
1f200 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53  ayRecursive ? pS
1f210 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65  el->pPrior : pSe
1f220 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  l);..    for(pLe
1f230 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
1f240 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
1f250 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
1f260 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
1f270 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
1f280 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
1f290 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
1f2a0 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e  t->nExpr!=pCte->
1f2b0 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a  pCols->nExpr ){.
1f2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f2d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f2e0 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64  "table %s has %d
1f2f0 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
1f300 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20  olumns",.       
1f310 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65       pCte->zName
1f320 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
1f330 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45   pCte->pCols->nE
1f340 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
1f350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
1f360 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
1f370 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
1f380 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
1f390 20 7d 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c   }.    selectCol
1f3a0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
1f3b0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
1f3c0 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
1f3d0 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 0a 20 20 20  Tab->aCol);..   
1f3e0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
1f3f0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
1f400 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
1f410 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
1f420 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
1f430 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
1f440 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
1f450 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
1f460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f470 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65  pCte->zErr = "re
1f480 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
1f490 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
1f4a0 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
1f4b0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
1f4c0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1f4d0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
1f4e0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a  pCte->zErr = 0;.
1f4f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1f500 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1f510 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1f520 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
1f530 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
1f540 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
1f550 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1f560 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
1f570 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
1f580 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1f590 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
1f5a0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1f5b0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
1f5c0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
1f5d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
1f5e0 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
1f5f0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1f600 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
1f610 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
1f620 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
1f630 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1f640 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
1f650 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
1f660 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
1f670 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
1f680 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
1f690 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
1f6a0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
1f6b0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1f6c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f6d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
1f6e0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
1f6f0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
1f700 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
1f710 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
1f720 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1f730 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
1f740 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
1f750 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
1f760 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
1f770 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
1f780 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
1f790 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
1f7a0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
1f7b0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
1f7c0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
1f7d0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
1f7e0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
1f7f0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
1f800 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
1f810 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
1f820 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
1f830 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1f840 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
1f850 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
1f860 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
1f870 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f880 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
1f890 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
1f8a0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
1f8b0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
1f8c0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
1f8d0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
1f8e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
1f8f0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
1f900 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
1f910 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
1f920 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
1f930 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
1f940 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1f950 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
1f960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1f970 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
1f980 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1f990 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
1f9a0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
1f9b0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
1f9c0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
1f9d0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1f9e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1f9f0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1fa00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
1fa10 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1fa20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1fa30 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
1fa40 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
1fa50 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
1fa60 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
1fa70 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
1fa80 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
1fa90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1faa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1fab0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
1fac0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
1fad0 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
1fae0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1faf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1fb00 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1fb10 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
1fb20 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1fb30 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1fb40 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
1fb50 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
1fb60 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
1fb70 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
1fb80 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
1fb90 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
1fba0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1fbb0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
1fbc0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1fbd0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
1fbe0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
1fbf0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
1fc00 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
1fc10 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fc20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
1fc30 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1fc40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
1fc50 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
1fc60 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
1fc70 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
1fc80 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
1fc90 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1fca0 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
1fcb0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1fcc0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
1fcd0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1fce0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1fcf0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1fd00 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1fd10 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
1fd20 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  From->isRecursiv
1fd30 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70  e==0 || pFrom->p
1fd40 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Tab );.    if( p
1fd50 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  From->isRecursiv
1fd60 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
1fd70 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1fd80 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
1fd90 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
1fda0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1fdb0 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
1fdc0 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
1fdd0 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
1fde0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
1fdf0 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
1fe00 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1fe10 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rune;.    }.#ifn
1fe20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fe30 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
1fe40 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
1fe50 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
1fe60 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
1fe70 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
1fe80 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
1fe90 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
1fea0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
1feb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1fec0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
1fed0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
1fee0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1fef0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1ff00 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1ff10 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1ff20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1ff30 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
1ff40 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1ff50 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1ff60 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1ff70 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1ff80 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  el);.      pFrom
1ff90 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1ffa0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1ffb0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1ffc0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
1ffd0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1ffe0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1fff0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
20000 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
20010 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
20020 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
20030 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64  te_sq_%p", (void
20040 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
20050 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
20060 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
20070 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
20080 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
20090 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
200a0 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
200b0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
200c0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
200d0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
200e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
200f0 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
20100 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  576;.      pTab-
20110 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
20120 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
20130 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
20140 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
20150 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
20160 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
20170 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
20180 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
20190 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
201a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
201b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
201c0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
201d0 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
201e0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
201f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
20200 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
20210 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66  pTab->nRef==0xff
20220 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
20230 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20240 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
20250 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
20260 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
20270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
20280 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
20290 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
202a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
202b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
202c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
202d0 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
202e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
202f0 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
20300 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
20310 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
20320 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
20330 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
20340 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
20350 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
20360 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
20370 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
20380 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
20390 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
203a0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
203b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
203c0 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
203d0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
203e0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
203f0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
20400 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
20410 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
20420 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
20430 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
20440 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
20450 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
20460 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
20470 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
20490 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
204a0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
204b0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
204c0 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
204d0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
204e0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
204f0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
20500 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
20510 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
20520 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
20530 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
20540 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
20550 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
20560 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
20570 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
20580 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
20590 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
205a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
205b0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
205c0 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
205d0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
205e0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
205f0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
20600 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
20610 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
20620 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
20630 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
20640 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
20650 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
20660 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
20670 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
20680 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
20690 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
206a0 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
206b0 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
206c0 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
206d0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
206e0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
206f0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
20700 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
20710 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
20720 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
20730 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
20740 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
20750 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
20760 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
20770 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
20780 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
20790 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
207a0 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
207b0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
207c0 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
207d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
207e0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
207f0 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
20800 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
20810 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
20820 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
20830 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
20840 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
20850 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
20860 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
20870 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
20880 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
20890 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
208a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
208b0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
208c0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
208d0 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
208e0 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
208f0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
20900 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
20910 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
20920 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
20930 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
20940 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
20950 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
20960 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
20970 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
20980 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
20990 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
209a0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
209b0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
209c0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
209d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
209e0 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
209f0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
20a00 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
20a10 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
20a20 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
20a30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
20a40 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
20a50 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
20a60 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
20a80 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20a90 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
20aa0 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
20ab0 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d  processing FROM-
20ac0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
20ad0 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  s, it is always 
20ae0 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  the case.    ** 
20af0 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  that full_column
20b00 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73  _names=OFF and s
20b10 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
20b20 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a  s=ON.  The.    *
20b30 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  * sqlite3ResultS
20b40 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75  etOfSelect() rou
20b50 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f  tine makes it so
20b60 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
20b70 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
20b80 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
20b90 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0.          || (
20ba0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20bb0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  FullColNames)==0
20bc0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
20bd0 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
20be0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
20bf0 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  !=0) );..    for
20c00 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
20c10 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
20c20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
20c30 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
20c40 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
20c50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
20c60 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
20c70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
20c80 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
20c90 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21  _ALL && (pE->op!
20ca0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
20cb0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
20cc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
20cd0 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
20ce0 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
20cf0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
20d00 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
20d10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
20d20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
20d30 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
20d40 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
20d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
20d60 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
20d70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
20d80 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
20d90 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
20da0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
20db0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
20dc0 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
20dd0 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
20de0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
20df0 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
20e00 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
20e10 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
20e20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
20e30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
20e40 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
20e50 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
20e60 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
20e70 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
20e80 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
20e90 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
20ea0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
20eb0 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
20ec0 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
20ed0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
20ee0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
20ef0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
20f00 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
20f10 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
20f20 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
20f30 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
20f40 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
20f50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
20f60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20f70 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
20f80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
20f90 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
20fa0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
20fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20fc0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
20fd0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
20fe0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
20ff0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
21000 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
21010 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
21020 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
21030 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
21040 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
21050 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
21060 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
21070 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
21080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
21090 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
210a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
210b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
210c0 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
210d0 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
210e0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
210f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
21100 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
21110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
21120 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
21130 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
21140 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
21150 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
21160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21170 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
21180 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
21190 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
211a0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
211b0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
211d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
211e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
211f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
21200 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
21210 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
21220 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
21230 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
21240 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
21250 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
21260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21270 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
21280 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
21290 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
212a0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
212b0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
212c0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
212d0 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
212e0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
212f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
21300 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
21310 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
21320 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
21330 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
21340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21350 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
21360 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
21370 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
21380 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
21390 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
213a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
213b0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
213c0 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
213d0 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
213e0 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
213f0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
21400 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
21410 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
21420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21430 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21440 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21450 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
21460 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
21470 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
21480 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
21490 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
214a0 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
214b0 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
214c0 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
214d0 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
214e0 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
214f0 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
21500 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21510 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
21520 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
21530 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
21540 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21550 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
21560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21590 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
215a0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
215b0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
215c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
215d0 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
215e0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
215f0 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
21600 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
21610 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
21620 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
21630 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
21640 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21660 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
21670 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
21680 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
21690 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
216a0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
216b0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
216c0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
216d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
216e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
216f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
21700 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
21710 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
21720 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
21730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21740 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
21750 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
21760 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
21770 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
21780 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
21790 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
217a0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
217b0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
217c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
217d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
217e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
217f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
21800 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
21810 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
21820 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
21830 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
21840 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
21850 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
21860 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
21870 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
21880 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
21890 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
218a0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
218b0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
218c0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
218d0 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
218e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
218f0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
21900 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
21910 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
21920 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
21930 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
21940 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
21950 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
21960 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
21970 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
21980 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
21990 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
219a0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
219b0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
219c0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
219d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
219e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
219f0 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
21a00 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
21a10 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
21a20 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
21a30 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
21a40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
21a50 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
21a60 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
21a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
21aa0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
21ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21ac0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
21ad0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
21ae0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
21af0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
21b00 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
21b10 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
21b20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
21b30 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
21b40 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
21b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21b60 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
21b70 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
21b80 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
21b90 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
21ba0 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
21bb0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
21bc0 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
21bd0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
21be0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
21bf0 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
21c00 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
21c10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
21c20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
21c30 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
21c40 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
21c50 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
21c60 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
21c90 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
21ca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21cc0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
21cd0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
21ce0 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d10 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
21d20 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
21d30 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
21d40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21d50 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
21d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21d80 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
21d90 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
21da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21db0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21dc0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
21dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21de0 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
21df0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
21e00 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
21e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21e20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21e30 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
21e40 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
21e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21e60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21e70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21e80 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
21e90 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
21ea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21ec0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
21ed0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
21ee0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
21ef0 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
21f00 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
21f10 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
21f20 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
21f30 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
21f40 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
21f50 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
21f60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
21f70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
21f80 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
21f90 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
21fa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
21fb0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
21fc0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  e;.}../*.** Func
21fd0 74 69 6f 6e 20 28 6f 72 20 6d 61 63 72 6f 29 20  tion (or macro) 
21fe0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 57 69  selectExpanderWi
21ff0 74 68 20 69 73 20 75 73 65 64 20 61 73 20 74 68  th is used as th
22000 65 20 53 45 4c 45 43 54 20 63 61 6c 6c 62 61 63  e SELECT callbac
22010 6b 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 53  k.** by sqlite3S
22020 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20 49  electExpand(). I
22030 6e 20 62 75 69 6c 64 73 20 74 68 61 74 20 64 6f  n builds that do
22040 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 43 54 45   not support CTE
22050 73 2c 20 74 68 69 73 0a 2a 2a 20 69 73 20 65 71  s, this.** is eq
22060 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
22070 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
22080 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 43 54   function. In CT
22090 45 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73  E-enabled builds
220a0 2c 0a 2a 2a 20 61 6e 79 20 57 49 54 48 20 63 6c  ,.** any WITH cl
220b0 61 75 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  ause associated 
220c0 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
220d0 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20  statement needs 
220e0 74 6f 20 62 65 0a 2a 2a 20 70 75 73 68 65 64 20  to be.** pushed 
220f0 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 62  onto the stack b
22100 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 65  efore calling se
22110 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 2c 20  lectExpander(), 
22120 61 6e 64 20 70 6f 70 70 65 64 0a 2a 2a 20 6f 66  and popped.** of
22130 66 20 61 67 61 69 6e 20 61 66 74 65 72 77 61 72  f again afterwar
22140 64 73 2e 20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ds. .*/.#ifndef 
22150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
22160 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
22170 74 45 78 70 61 6e 64 65 72 57 69 74 68 28 57 61  tExpanderWith(Wa
22180 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
22190 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
221a0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
221b0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
221c0 69 6e 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74  int res;.  sqlit
221d0 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
221e0 65 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20  e, p->pWith);.  
221f0 72 65 73 20 3d 20 73 65 6c 65 63 74 45 78 70 61  res = selectExpa
22200 6e 64 65 72 28 70 57 61 6c 6b 65 72 2c 20 70 29  nder(pWalker, p)
22210 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68  ;.  if( p->pWith
22220 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22230 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
22240 2d 3e 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ->pWith );.    p
22250 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22260 2d 3e 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  ->pWith->pOuter;
22270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
22280 73 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  s;.}.#else.#defi
22290 6e 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  ne selectExpande
222a0 72 57 69 74 68 20 73 65 6c 65 63 74 45 78 70 61  rWith selectExpa
222b0 6e 64 65 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  nder.#endif../*.
222c0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
222d0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
222e0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
222f0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
22300 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
22310 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
22320 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
22330 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
22340 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
22350 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
22360 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
22370 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
22380 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
22390 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
223a0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
223b0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
223c0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
223d0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
223e0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
223f0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
22400 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
22410 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
22420 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
22430 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
22440 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
22450 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
22460 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
22470 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
22480 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
22490 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
224a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
224b0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
224c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
224d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
224e0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
224f0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
22500 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
22510 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
22520 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
22530 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
22540 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
22550 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
22560 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
22570 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
22580 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
22590 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
225a0 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
225b0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
225c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
225d0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
225e0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
225f0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
22600 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
22610 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
22620 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
22630 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
22640 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
22650 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
22660 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
22670 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
22680 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
22690 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
226a0 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
226b0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
226c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
226d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
226e0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
226f0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
22700 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
22710 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
22720 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
22730 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
22740 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
22750 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
22760 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
22770 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
22780 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
22790 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
227a0 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
227b0 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
227c0 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
227d0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
227e0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
227f0 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
22800 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
22810 45 78 70 61 6e 64 65 72 57 69 74 68 3b 0a 20 20  ExpanderWith;.  
22820 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
22830 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
22840 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
22850 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
22860 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
22870 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
22880 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
22890 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
228a0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
228b0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
228c0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
228d0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
228e0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
228f0 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
22900 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
22910 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
22920 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
22930 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
22940 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
22950 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
22960 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
22970 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
22980 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
22990 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
229a0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
229b0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
229c0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
229d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
229e0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
229f0 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
22a00 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
22a10 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
22a20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
22a30 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
22a40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
22a50 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
22a60 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
22a70 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41  atic int selectA
22a80 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
22a90 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
22aa0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
22ab0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
22ac0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
22ad0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
22ae0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22af0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
22b00 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
22b10 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
22b20 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  d );.  if( (p->s
22b30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
22b40 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a  TypeInfo)==0 ){.
22b50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
22b60 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
22b70 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20  o;.    pParse = 
22b80 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22b90 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
22ba0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
22bb0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
22bc0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
22bd0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
22be0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
22bf0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
22c00 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
22c10 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
22c20 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
22c30 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
22c40 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
22c50 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
22c60 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
22c70 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
22c80 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
22c90 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
22ca0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
22cb0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29        if( pSel )
22cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
22cd0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
22ce0 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
22cf0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
22d00 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
22d10 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
22d20 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
22d30 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Sel);.        }.
22d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22d50 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
22d60 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
22d70 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
22d80 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
22d90 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
22da0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
22db0 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
22dc0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
22dd0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
22de0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
22df0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
22e00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
22e10 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
22e20 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
22e30 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
22e40 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
22e50 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
22e60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22e70 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
22e80 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
22e90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
22ea0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
22eb0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
22ec0 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
22ed0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
22ee0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
22ef0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
22f00 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
22f10 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
22f20 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
22f30 20 77 2e 62 53 65 6c 65 63 74 44 65 70 74 68 46   w.bSelectDepthF
22f40 69 72 73 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69  irst = 1;.  sqli
22f50 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
22f60 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
22f70 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
22f80 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
22f90 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
22fa0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
22fb0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
22fc0 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
22fd0 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
22fe0 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
22ff0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
23000 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
23010 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
23020 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
23030 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
23040 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
23050 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
23060 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
23070 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
23080 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
23090 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
230a0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
230b0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
230c0 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
230d0 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
230e0 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
230f0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
23100 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
23110 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
23120 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
23130 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23140 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
23150 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
23160 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
23170 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
23180 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
23190 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
231a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
231b0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
231c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
231e0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
231f0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
23200 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
23210 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
23220 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
23230 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
23240 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23250 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
23260 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
23270 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23280 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23290 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
232a0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
232b0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
232c0 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
232d0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
232e0 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
232f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23300 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
23310 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
23320 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
23330 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
23340 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
23350 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
23360 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
23370 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
23380 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
23390 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
233a0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
233b0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
233c0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
233d0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
233e0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
233f0 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
23400 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
23410 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
23420 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
23430 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
23440 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
23450 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
23460 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
23470 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
23480 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
23490 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
234a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
234b0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
234c0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
234d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
234e0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
234f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23500 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
23510 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
23520 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
23530 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
23540 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
23550 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
23560 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
23570 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23580 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
23590 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
235a0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
235b0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
235c0 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
235d0 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
235e0 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
235f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
23600 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
23610 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
23620 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
23630 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
23640 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
23650 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
23660 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
23670 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
23680 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
23690 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
236a0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
236b0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
236c0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
236d0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
236e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
236f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
23700 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
23710 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
23720 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
23730 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
23740 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
23750 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
23760 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
23770 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
23780 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
23790 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
237a0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
237b0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
237c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
237d0 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
237e0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
237f0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
23800 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
23810 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
23820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
23830 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23840 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
23850 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
23860 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
23870 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
23880 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
23890 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
238a0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
238b0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
238c0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
238d0 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
238e0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
238f0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
23900 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
23910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23920 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
23930 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
23940 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
23950 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b  e, pE->x.pList);
23960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23970 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
23980 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
23990 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
239a0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
239d0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
239e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
239f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
23a00 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
23a10 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
23a20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
23a30 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
23a40 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
23a50 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
23a60 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
23a70 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
23a80 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
23a90 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
23aa0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
23ab0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
23ac0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
23ad0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
23ae0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
23af0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
23b00 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
23b10 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
23b20 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
23b30 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
23b40 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
23b50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23b60 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
23b70 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
23b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23b90 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
23ba0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
23bb0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
23bc0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
23bf0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
23c00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
23c10 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
23c20 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
23c30 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
23c40 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
23c50 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
23c60 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
23c70 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
23c80 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
23c90 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
23ca0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
23cb0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
23cc0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
23cd0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
23ce0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
23cf0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
23d00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
23d10 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
23d20 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
23d30 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
23d40 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
23d50 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
23d60 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
23d70 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
23d80 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
23d90 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
23da0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
23db0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
23dc0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
23dd0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
23de0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
23df0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23e00 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
23e10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
23e20 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
23e30 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
23e40 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
23e50 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
23e60 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
23e70 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
23e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23e90 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
23ea0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
23eb0 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
23ec0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
23ed0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
23ee0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
23ef0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
23f00 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
23f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
23f20 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
23f30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23f40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
23f50 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
23f60 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
23f70 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
23f80 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
23f90 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
23fa0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
23fb0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
23fc0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
23fd0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
23fe0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
23ff0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
24000 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24010 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
24020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
24030 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
24040 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
24050 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
24060 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
24070 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
24080 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
24090 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
240a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
240b0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
240c0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
240d0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
240e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
240f0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
24100 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
24110 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
24120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24130 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
24140 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
24150 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
24160 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24180 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
24190 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
241a0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
241b0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
241c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
241d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
241e0 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
241f0 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
24200 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
24210 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
24220 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
24230 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
24240 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
24250 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
24260 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24270 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
24280 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
24290 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
242a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
242b0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
242c0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
242d0 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
242e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
242f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
24300 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
24310 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
24320 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
24330 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24340 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
24350 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
24360 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
24370 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
24380 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
24390 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
243a0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
243b0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
243c0 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
243d0 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
243e0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
243f0 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
24400 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
24410 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
24420 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
24430 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
24440 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
24450 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
24460 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
24470 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
24480 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
24490 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
244a0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
244b0 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
244c0 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
244d0 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
244e0 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
244f0 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
24500 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
24510 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
24520 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
24530 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
24540 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
24550 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
24560 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
24570 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
24580 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
24590 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
245a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
245b0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
245c0 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
245d0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
245e0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
245f0 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
24600 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
24610 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
24620 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
24630 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
24640 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
24650 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
24660 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
24670 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
24680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
24690 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
246a0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
246b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
246c0 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
246d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
246e0 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
246f0 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
24700 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
24710 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
24720 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
24730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24740 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
24750 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
24760 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
24770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24790 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
247a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
247b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247c0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
247d0 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
247e0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
24810 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
24820 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
24830 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
24840 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
24850 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
24860 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
24870 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
24880 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
24890 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
248a0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
248b0 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
248c0 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
248d0 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70          pIdx ? p
248e0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
248f0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
24900 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
24910 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
24920 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
24930 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
24940 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
24950 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
24960 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
24970 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
24980 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
24990 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
249a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
249b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
249c0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
249d0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
249e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
249f0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
24a00 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
24a10 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
24a20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
24a30 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
24a40 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
24a50 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
24a60 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
24a70 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
24a80 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
24a90 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
24aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
24ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
24ae0 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
24af0 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
24b00 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
24b10 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
24b20 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
24b30 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
24b40 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
24b50 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
24b60 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
24b70 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
24b80 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
24b90 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
24ba0 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
24bd0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
24be0 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
24bf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
24c00 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
24c10 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  er pDest->iSDPar
24c20 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74  m then abandon t
24c30 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20  he rest.**      
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
24c50 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  f the query.  Th
24c60 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  is destination i
24c70 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22  mplies "LIMIT 1"
24c80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
24c90 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20  Set         The 
24ca0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61  result must be a
24cb0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20   single column. 
24cc0 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20   Store each.**  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74     row of result
24cf0 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74   as the key in t
24d00 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
24d10 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
24d30 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
24d40 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62  pDest->affSdst b
24d50 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a  efore storing.**
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55       results.  U
24d80 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
24d90 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
24da0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  )"..**.**     SR
24db0 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
24dc0 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
24dd0 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
24de0 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20  ary table .**   
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
24e10 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
24e20 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
24e30 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
24e40 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
24e50 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
24e60 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  e pDest->iSDParm
24e70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
24e80 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
24e90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
24ea0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
24eb0 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20  st->iSDParm..** 
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
24ee0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
24ef0 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
24f00 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
24f10 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
24f20 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
24f30 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
24f40 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
24f50 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
24f60 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
24f70 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64  est->iSDParm and
24f80 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
24fa0 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
24fb0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
24fc0 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
24ff0 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
25000 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
25010 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
25020 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
25030 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
25040 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
25050 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
25080 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
25090 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
250a0 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
250b0 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
250c0 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
250f0 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
25100 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
25110 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
25130 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
25140 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
25150 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44  ister pDest->iSD
25160 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
25170 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
25180 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
25190 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
251a0 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20 72  iSDParm if the r
251b0 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  esult.**        
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
251d0 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a   is not empty..*
251e0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73  *.**     SRT_Dis
251f0 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74  card     Throw t
25200 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e  he results away.
25210 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
25220 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  y SELECT.**     
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
25250 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73 65  n triggers whose
25260 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73   only purpose is
25270 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25280 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64 65          the side
25290 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63  -effects of func
252a0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
252b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
252c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
252d0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
252e0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
252f0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
25300 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
25310 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
25320 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
25330 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
25340 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
25350 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
25360 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
25370 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
25380 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
25390 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
253a0 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
253b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
253c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
253d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
253e0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
253f0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
25400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25410 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25420 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
25430 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
25440 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
25450 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
25460 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
25470 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25490 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
254a0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
254b0 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
254c0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
254d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
254e0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
254f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25500 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
25510 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
25520 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
25530 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
25540 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
25550 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
25560 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
25570 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
25580 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
25590 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
255a0 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
255b0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
255c0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
255d0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
255e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
255f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
25600 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
25610 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
25620 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
25630 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
25640 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
25650 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
25660 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25670 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
25680 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
25690 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
256a0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
256b0 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
256c0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
256d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
256e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
256f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
25700 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
25710 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
25720 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
25730 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
25740 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
25750 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
25760 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
25770 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
25780 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
25790 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
257a0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
257b0 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ord */.  AggInfo
257c0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
257d0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
257e0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
257f0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
25800 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
25810 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
25820 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
25830 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
25840 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
25850 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
25860 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
25870 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
25880 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
25890 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
258a0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
258b0 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
258c0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
258d0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
258e0 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
258f0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
25900 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
25910 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
25920 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
25930 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
25940 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
25950 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
25960 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
25970 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
25980 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
25990 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
259a0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
259b0 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e  fo));..  if( Ign
259c0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
259d0 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
259e0 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
259f0 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
25a00 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
25a10 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
25a20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
25a30 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
25a40 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
25a50 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20  SRT_Discard);.  
25a60 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
25a70 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
25a80 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
25a90 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
25aa0 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
25ab0 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
25ac0 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
25ad0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
25ae0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
25af0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
25b00 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
25b10 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
25b20 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
25b30 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
25b40 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
25b50 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72  se, p, 0);.  pOr
25b60 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
25b70 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
25b80 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
25b90 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
25ba0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
25bb0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
25bc0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
25bd0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
25be0 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70    }.  isAgg = (p
25bf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25c00 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
25c10 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
25c20 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
25c30 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
25c40 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
25c50 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
25c60 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
25c70 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
25c80 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
25c90 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
25ca0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
25cb0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
25cc0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
25cd0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
25ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25cf0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
25d00 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
25d10 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
25d20 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
25d30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
25d40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
25d50 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
25d60 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
25d70 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
25d80 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
25d90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
25da0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
25db0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
25dc0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
25dd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
25de0 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
25df0 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
25e00 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
25e10 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
25e20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25e30 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
25e40 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
25e50 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
25e60 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
25e70 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
25e80 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
25e90 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
25ea0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
25eb0 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
25ec0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
25ed0 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
25ee0 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
25ef0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
25f00 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
25f10 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
25f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
25f30 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
25f40 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
25f50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
25f60 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
25f70 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
25f80 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
25f90 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
25fa0 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
25fb0 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
25fc0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
25fd0 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
25fe0 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
25ff0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
26000 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
26010 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
26020 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
26030 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
26040 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
26050 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
26060 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72  f( pItem->viaCor
26070 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
26080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
260a0 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
260b0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
260c0 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
260d0 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
260e0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
260f0 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
26100 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
26110 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
26120 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
26130 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
26140 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
26150 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
26160 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
26170 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
26180 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
26190 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
261a0 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
261b0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
261c0 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
261d0 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
261e0 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
261f0 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
26200 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
26210 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
26220 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
26230 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
26240 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
26250 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
26260 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
26270 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
26280 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
26290 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
262a0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
262b0 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
262c0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
262d0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
262e0 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
262f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
26300 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
26310 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
26320 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
26330 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
26340 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
26350 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
26360 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
26370 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
26380 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
26390 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
263a0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  List->nSrc==1 &&
263b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
263c0 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d  SF_Materialize)=
263d0 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69  =0.      && Opti
263e0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
263f0 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
26400 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b  oroutine).    ){
26410 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
26420 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
26430 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
26440 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
26450 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
26460 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
26470 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
26480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
26490 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
264a0 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20  int addrEof;.   
264b0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
264c0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
264d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
264e0 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Eof = ++pParse->
264f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42  nMem;.      /* B
26500 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65  efore coding the
26510 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70   OP_Goto to jump
26520 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
26530 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
26540 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75  e,.      ** ensu
26550 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  re that the jump
26560 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73   to the verify-s
26570 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61  chema routine ha
26580 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  s already.      
26590 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f  ** been coded. O
265a0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 65  therwise, the ve
265b0 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c  rify-schema woul
265c0 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65  d likely be code
265d0 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  d as .      ** p
265e0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  art of the co-ro
265f0 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61  utine. If the ma
26600 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20  in routine then 
26610 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20 20  accessed the .  
26620 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
26630 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
26640 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66  the co-routine f
26650 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
26660 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  e (for .      **
26670 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74   example to init
26680 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72  ialize a LIMIT r
26690 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73  egister from a s
266a0 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77  ub-select), it w
266b0 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  ould .      ** b
266c0 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f  e doing so witho
266d0 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66 69  ut having verifi
266e0 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  ed the schema ve
266f0 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e  rsion and obtain
26700 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ed .      ** the
26710 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63   required db loc
26720 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64  ks. See ticket d
26730 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20  6b36be38.  */.  
26740 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
26750 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
26760 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  se, -1);.      s
26770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
26780 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
26790 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
267a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
267b0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
267c0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
267d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
267e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
267f0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
26800 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75  mment((v, "corou
26810 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49  tine for %s", pI
26820 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
26830 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
26840 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
26850 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
26860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26870 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
26880 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
26890 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
268a0 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
268b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
268c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
268d0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
268e0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
268f0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
26900 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
26910 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
26920 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
26930 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
26940 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
26950 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
26960 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
26970 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
26980 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
26990 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
269a0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
269b0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
269c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
269d0 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20  eP2(v, addrTop, 
269e0 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20  dest.iSdst);.   
269f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26a00 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f  angeP3(v, addrTo
26a10 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a  p, dest.nSdst);.
26a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26a30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
26a40 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f  teger, 1, addrEo
26a50 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
26a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
26a70 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e  P_Yield, pItem->
26a80 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
26a90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
26aa0 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
26ab0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
26ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26ad0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
26ae0 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
26af0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
26b00 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
26b10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26b20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
26b30 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
26b40 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
26b50 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
26b60 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
26b70 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
26b80 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
26b90 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
26ba0 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
26bb0 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
26bc0 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
26bd0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
26be0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
26bf0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
26c00 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
26c10 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
26c20 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
26c30 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
26c40 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
26c50 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
26c60 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
26c70 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
26c80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
26c90 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
26ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
26cb0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
26cc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
26cd0 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
26ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26cf0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
26d00 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
26d10 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
26d20 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
26d30 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
26d40 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
26d50 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
26d60 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  ze %s", pItem->p
26d70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
26d80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
26d90 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
26da0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
26db0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
26dc0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
26dd0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
26de0 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
26df0 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
26e00 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
26e10 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
26e20 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
26e30 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
26e40 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
26e50 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
26e60 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
26e70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
26e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
26e90 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
26ea0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
26eb0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
26ec0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
26ed0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
26ee0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
26ef0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
26f00 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
26f10 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
26f20 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
26f30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
26f40 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
26f50 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
26f60 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
26f70 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
26f80 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
26f90 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
26fa0 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
26fb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26fc0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
26fd0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
26fe0 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
26ff0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
27000 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
27010 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
27020 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27030 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
27040 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
27050 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
27060 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
27070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27080 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
27090 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
270a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
270b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
270c0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
270d0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
270e0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
270f0 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
27100 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
27110 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
27120 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
27130 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
27140 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
27150 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
27160 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
27170 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
27180 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
27190 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
271a0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
271b0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
271c0 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
271d0 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
271e0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
271f0 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
27200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
27210 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
27220 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
27230 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
27240 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
27250 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
27260 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
27270 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
27280 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
27290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
272a0 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
272b0 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
272c0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
272d0 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
272e0 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
272f0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
27300 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
27310 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
27320 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
27330 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
27340 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
27350 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
27360 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
27370 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
27380 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
27390 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
273a0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
273b0 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
273c0 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
273d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
273e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
273f0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
27400 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
27410 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
27420 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
27430 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
27440 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
27450 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
27460 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
27470 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
27480 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
27490 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
274a0 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
274b0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
274c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
274d0 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
274e0 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
274f0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
27500 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
27510 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
27520 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
27530 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
27540 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
27550 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
27560 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
27570 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
27580 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
27590 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
275a0 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
275b0 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
275c0 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
275d0 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
275e0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
275f0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
27600 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
27610 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
27620 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
27630 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
27640 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
27650 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
27660 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
27670 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
27680 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a  OrderBy, -1)==0.
27690 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
276a0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
276b0 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
276c0 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20  ByOrder) ){.    
276d0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
276e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  }..  /* If the q
276f0 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
27700 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
27710 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
27720 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
27730 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
27740 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
27750 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
27760 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
27770 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
27780 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
27790 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
277a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
277b0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
277c0 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
277d0 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
277e0 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
277f0 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
27800 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
27810 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
27820 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
27830 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
27840 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
27850 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
27860 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
27870 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
27880 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
27890 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
278a0 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
278b0 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
278c0 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
278d0 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
278e0 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
278f0 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
27900 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
27910 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
27920 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
27930 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
27940 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
27950 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
27960 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
27970 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
27980 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
27990 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
279a0 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
279b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
279c0 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79  Compare(pOrderBy
279d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29  , p->pEList, -1)
279e0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
279f0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
27a00 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d  Distinct;.    p-
27a10 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
27a20 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
27a30 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29  b, p->pEList, 0)
27a40 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
27a50 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
27a60 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
27a70 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
27a80 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
27a90 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
27aa0 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
27ab0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
27ac0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
27ad0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
27ae0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
27af0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
27b00 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
27b10 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
27b20 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
27b30 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
27b40 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
27b50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
27b60 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
27b70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
27b80 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
27b90 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
27ba0 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
27bb0 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
27bc0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
27bd0 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
27be0 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
27bf0 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
27c00 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
27c10 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
27c20 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
27c30 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
27c40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
27c50 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
27c60 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
27c70 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
27c80 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
27c90 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
27ca0 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
27cb0 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
27cc0 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
27cd0 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
27ce0 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
27cf0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
27d00 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
27d10 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
27d20 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
27d30 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
27d40 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
27d50 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69  .    pOrderBy->i
27d60 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
27d70 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d  ->nTab++;.    p-
27d80 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
27d90 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78   = addrSortIndex
27da0 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
27db0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
27dc0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
27df0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
27e00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
27e10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
27e40 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
27e50 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
27e60 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
27e70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
27e80 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
27e90 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
27ea0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
27eb0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
27ec0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
27ed0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
27ee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
27ef0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27f00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
27f10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
27f20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
27f30 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
27f40 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
27f50 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
27f60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
27f70 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
27f80 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
27f90 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
27fa0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
27fb0 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
27fc0 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
27fd0 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  & addrSortIndex>
27fe0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
27ff0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
28000 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70  drSortIndex)->op
28010 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72  code = OP_Sorter
28020 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  Open;.    p->sel
28030 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 53  Flags |= SF_UseS
28040 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
28050 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
28060 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
28070 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
28080 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
28090 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
280a0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
280b0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
280c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
280d0 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
280e0 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
280f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28100 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
28110 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
28140 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
28170 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
28180 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28190 2d 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20 20  ->pEList),.     
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
281c0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
281d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
281e0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
281f0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
28200 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
28210 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
28220 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
28230 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
28240 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
28250 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
28260 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
28270 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
28280 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
28290 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
282a0 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
282b0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
282c0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
282d0 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
282e0 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
282f0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
28300 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
28310 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
28320 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
28330 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
28340 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
28350 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72  ist, pWhere, pOr
28360 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
28370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
283a0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
283b0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
283c0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
283d0 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
283e0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
283f0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
28400 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
28410 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
28420 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
28430 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
28440 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
28450 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
28460 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
28470 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
28480 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
28490 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
284a0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
284b0 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
284c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
284d0 65 72 42 79 20 26 26 20 73 71 6c 69 74 65 33 57  erBy && sqlite3W
284e0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
284f0 49 6e 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79  Info) ) pOrderBy
28500 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
28510 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
28520 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
28530 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
28540 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
28550 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
28560 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
28570 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
28580 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
28590 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
285a0 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
285b0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
285c0 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
285d0 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
285e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
285f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
28600 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
28610 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
28620 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
28630 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
28640 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
28650 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
28660 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
28670 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
28680 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
28690 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73   pOrderBy, &sDis
286a0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
286d0 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
286e0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
286f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28700 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
28710 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
28720 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
28730 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
28740 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
28750 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
28760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28770 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
28780 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
28790 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
287a0 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
287b0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
287c0 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
287d0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
287e0 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
287f0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
28800 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
28810 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
28820 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
28830 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
28840 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
28850 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
28860 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
28870 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
28880 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
28890 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
288a0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
288b0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
288c0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
288d0 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
288e0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
288f0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28910 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
28920 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
28930 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
28940 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
28950 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
28960 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
28970 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
28980 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
28990 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
289a0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
289b0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
289c0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
289d0 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
289e0 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
289f0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
28a00 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
28a10 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
28a20 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
28a30 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
28a40 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
28a50 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
28a60 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
28a70 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
28a80 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
28a90 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
28aa0 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
28ab0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
28ac0 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ter */..    /* R
28ad0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
28ae0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
28af0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
28b00 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
28b10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
28b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28b30 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
28b40 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
28b70 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
28b80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
28b90 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
28ba0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
28bb0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
28bc0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
28bd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
28be0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
28bf0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
28c00 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
28c10 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
28c20 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
28c30 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
28c40 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
28c50 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
28c60 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
28c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
28c80 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
28c90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
28ca0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
28cb0 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65  Row>100 ) p->nSe
28cc0 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20  lectRow = 100;. 
28cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28ce0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
28cf0 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20  1;.    }.. .    
28d00 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
28d10 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
28d20 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
28d30 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
28d40 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
28d50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28d60 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
28d70 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
28d80 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
28d90 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
28da0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
28db0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
28dc0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
28dd0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
28de0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
28df0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
28e00 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
28e10 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
28e20 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
28e30 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
28e40 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
28e50 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
28e60 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
28e70 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
28e80 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
28e90 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
28ea0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
28eb0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
28ec0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
28ed0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
28ee0 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
28ef0 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
28f00 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
28f10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
28f20 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
28f30 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
28f40 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
28f50 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
28f60 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
28f70 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
28f80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
28f90 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
28fa0 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
28fb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
28fc0 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
28fd0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
28fe0 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
28ff0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
29000 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
29010 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
29020 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
29030 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
29040 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
29050 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
29060 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
29070 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
29080 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
29090 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
290a0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
290b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
290c0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
290d0 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
290e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
290f0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
29100 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
29110 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29120 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
29130 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
29140 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
29150 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
29160 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
29170 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
29180 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
29190 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
291a0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
291b0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
291c0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
291d0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
291e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
291f0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
29200 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
29210 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
29220 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
29230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
29240 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
29250 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
29260 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
29270 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
29280 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
29290 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
292a0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
292b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
292c0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
292d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
292e0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
292f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
29300 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
29310 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
29320 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
29330 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
29340 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
29350 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
29360 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
29370 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
29380 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
29390 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
293a0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
293b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
293c0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
293d0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
293e0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
293f0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
29400 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
29410 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29420 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
29430 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
29440 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
29450 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
29460 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
29470 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
29480 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
29490 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
294a0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
294b0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
294c0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
294d0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
294e0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
294f0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
29500 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
29510 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
29520 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
29530 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
29540 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
29550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
29560 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
29570 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
29580 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
29590 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
295a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
295b0 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
295c0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
295d0 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
295e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
295f0 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
29600 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
29610 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
29620 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
29630 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
29640 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
29650 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
29660 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
29670 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
29680 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
29690 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
296a0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
296b0 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
296c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
296d0 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
296e0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
296f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
29700 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
29710 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29720 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
29730 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
29740 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
29750 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
29760 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29770 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
29780 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29790 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
297a0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
297b0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
297c0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
297d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
297e0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
297f0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
29800 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
29810 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
29820 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
29830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29840 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
29850 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
29860 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29870 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
29880 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
29890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
298a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
298b0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
298c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
298d0 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
298e0 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
298f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29900 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
29910 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
29920 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
29930 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
29940 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
29950 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
29960 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
29970 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
29980 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
29990 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
299a0 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
299b0 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
299c0 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
299d0 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
299e0 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
299f0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
29a00 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
29a10 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
29a20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
29a30 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
29a40 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
29a50 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
29a60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29a70 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
29a80 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
29a90 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
29aa0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29ab0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
29ac0 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
29ad0 70 42 79 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  pBy, 0, .       
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
29b00 47 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20 20  GROUPBY, 0);.   
29b10 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
29b20 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
29b30 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
29b40 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
29b50 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  red(pWInfo) ){. 
29b60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
29b70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
29b80 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
29b90 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
29ba0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
29bb0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
29bc0 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
29bd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
29be0 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
29bf0 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
29c00 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
29c10 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
29c20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
29c30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29c40 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
29c50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
29c60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
29c70 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
29c80 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
29c90 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
29ca0 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
29cb0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
29cc0 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
29cd0 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
29ce0 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
29cf0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
29d00 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
29d10 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
29d20 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
29d30 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
29d40 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
29d50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29d60 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
29d70 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
29d80 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
29d90 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
29da0 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
29db0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
29dc0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
29dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
29de0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
29df0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
29e00 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
29e10 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
29e20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
29e30 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
29e40 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
29e50 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
29e60 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
29e70 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
29e80 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
29e90 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
29ea0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
29eb0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
29ec0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
29ed0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
29ee0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
29ef0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
29f00 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
29f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
29f20 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
29f30 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
29f40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29f50 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
29f60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
29f70 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
29f80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29f90 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29fa0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
29fb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
29fc0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
29fd0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
29fe0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
29ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a000 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
2a010 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2a020 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
2a030 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
2a040 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
2a050 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2a060 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2a070 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2a080 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2a090 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2a0a0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2a0b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2a0c0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2a0d0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2a0e0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2a0f0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2a100 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2a110 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2a120 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2a130 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2a140 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2a170 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2a180 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2a190 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2a1a0 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a1d0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2a1e0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2a1f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2a200 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2a210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a220 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2a230 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2a240 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2a250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a260 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2a270 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2a280 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2a290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a2a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a2b0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2a2c0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2a2d0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2a2e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2a2f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2a300 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2a310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a320 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2a330 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2a340 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2a350 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2a360 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2a370 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2a380 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2a390 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2a3a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2a3b0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2a3c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2a3d0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2a3e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2a3f0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2a400 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2a410 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2a420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a430 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2a440 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2a450 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2a460 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2a470 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2a480 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
2a490 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2a4a0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
2a4b0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
2a4c0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2a4d0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2a4e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
2a4f0 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
2a500 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
2a510 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
2a520 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
2a530 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
2a540 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
2a550 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
2a560 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
2a570 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
2a580 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
2a590 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2a5a0 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
2a5b0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
2a5c0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2a5d0 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
2a5e0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
2a5f0 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
2a600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
2a610 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
2a620 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2a630 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2a640 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2a650 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2a660 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2a670 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
2a680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a690 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
2a6a0 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
2a6b0 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29  ingIdx, sortOut)
2a6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a6d0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
2a6e0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
2a6f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
2a700 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2a710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a720 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2a730 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
2a740 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
2a750 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
2a760 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
2a770 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
2a780 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
2a790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a7a0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2a7b0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2a7c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a7d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2a7e0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
2a7f0 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
2a800 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a810 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2a820 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2a830 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
2a840 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
2a850 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a870 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
2a880 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
2a890 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
2a8a0 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
2a8b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2a8c0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2a8d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a8e0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
2a8f0 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
2a900 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2a910 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2a920 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2a930 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2a940 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2a950 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2a960 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2a970 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2a980 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2a990 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2a9a0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2a9b0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2a9c0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2a9d0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2a9e0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2a9f0 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2aa00 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2aa10 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2aa20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2aa30 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2aa40 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2aa50 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2aa60 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2aa70 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2aa80 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2aa90 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2aaa0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2aab0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2aac0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2aad0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2aae0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2aaf0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2ab00 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2ab10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ab20 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2ab30 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2ab40 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2ab50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ab60 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2ab70 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2ab80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ab90 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2aba0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
2abb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2abc0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
2abd0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2abe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2abf0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2ac00 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2ac10 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
2ac20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
2ac30 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
2ac40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
2ac50 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
2ac60 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
2ac70 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
2ac80 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
2ac90 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
2aca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2acb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2acc0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
2acd0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2ace0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2acf0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2ad00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ad10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
2ad20 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2ad30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ad40 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
2ad50 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
2ad60 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
2ad70 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
2ad80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2ad90 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2ada0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2adb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2adc0 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
2add0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2ade0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
2adf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ae00 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2ae10 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2ae20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ae30 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2ae40 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
2ae50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2ae60 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
2ae70 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
2ae80 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
2ae90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2aea0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2aeb0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
2aec0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2aed0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2aee0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
2aef0 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
2af00 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
2af10 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
2af20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2af30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2af40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
2af50 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
2af60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2af70 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2af80 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
2af90 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2afa0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
2afb0 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
2afc0 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
2afd0 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
2afe0 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
2aff0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
2b000 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
2b010 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
2b020 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
2b030 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
2b040 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
2b050 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
2b060 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
2b070 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2b080 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
2b090 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
2b0a0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
2b0b0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
2b0c0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
2b0d0 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
2b0e0 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
2b0f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
2b100 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
2b110 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2b120 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2b130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b140 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
2b150 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2b160 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2b170 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
2b180 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2b190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b1a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2b1b0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2b1c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b1d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2b1e0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2b1f0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2b200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b210 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2b220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b230 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2b240 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
2b250 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
2b260 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2b270 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
2b280 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
2b290 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
2b2a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b2b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2b2c0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2b2d0 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
2b2e0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2b2f0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2b300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b310 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2b320 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
2b330 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
2b340 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2b350 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2b360 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2b370 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
2b380 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3a0 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
2b3b0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
2b3d0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
2b3e0 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
2b3f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b400 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2b410 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2b420 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2b430 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
2b440 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2b450 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
2b460 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2b470 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2b480 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
2b490 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
2b4a0 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
2b4b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b4c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2b4d0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
2b4e0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2b4f0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2b500 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2b510 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b520 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
2b530 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
2b540 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
2b550 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
2b560 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
2b570 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
2b580 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
2b590 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
2b5a0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
2b5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2b5c0 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
2b5d0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2b5e0 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
2b5f0 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
2b600 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
2b610 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
2b620 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
2b630 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
2b640 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
2b650 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
2b660 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
2b670 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
2b680 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
2b690 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2b6a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2b6b0 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
2b6c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
2b6d0 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
2b6e0 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
2b6f0 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
2b700 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
2b710 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2b720 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
2b730 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
2b740 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
2b750 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
2b760 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
2b770 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
2b780 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
2b790 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
2b7a0 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
2b7b0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
2b7c0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
2b7d0 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
2b7e0 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
2b7f0 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
2b800 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
2b810 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
2b820 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
2b830 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
2b840 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
2b850 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
2b860 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
2b870 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
2b880 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
2b890 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
2b8a0 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
2b8b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2b8c0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
2b8d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2b8e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2b8f0 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
2b900 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
2b910 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
2b920 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
2b930 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2b960 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2b970 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2b980 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
2b990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
2b9a0 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
2b9b0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
2b9c0 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
2b9d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b9e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
2b9f0 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
2ba00 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
2ba10 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
2ba20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
2ba30 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2ba40 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
2ba50 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
2ba60 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2ba70 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2ba80 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
2ba90 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2baa0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2bab0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2bac0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
2bad0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
2bae0 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
2baf0 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
2bb00 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
2bb10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2bb20 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
2bb30 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
2bb40 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
2bb50 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2bb60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2bb70 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
2bb80 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
2bb90 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
2bba0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2bbb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
2bbc0 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
2bbd0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
2bbe0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
2bbf0 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
2bc00 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
2bc10 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
2bc20 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
2bc30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2bc40 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2bc50 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
2bc60 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2bc70 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2bc80 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2bc90 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2bca0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2bcc0 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
2bcd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2bce0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
2bcf0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
2bd00 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2bd10 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
2bd20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2bd30 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
2bd40 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
2bd50 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
2bd60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2bd70 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
2bd80 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
2bd90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bda0 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
2bdb0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
2bdc0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
2bdd0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
2bde0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2bdf0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
2be00 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
2be10 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
2be20 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
2be30 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
2be40 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
2be50 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
2be60 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2be70 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2be80 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
2be90 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
2bea0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2beb0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2bec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2bed0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2bee0 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
2bef0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2bf00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bf10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bf20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
2bf30 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
2bf40 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
2bf50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2bf60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2bf70 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
2bf80 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2bf90 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
2bfa0 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
2bfb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2bfc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2bfd0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
2bfe0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2bff0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2c000 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
2c010 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2c020 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
2c030 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c040 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
2c050 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2c060 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
2c070 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
2c080 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2c090 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2c0a0 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
2c0b0 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
2c0c0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
2c0d0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
2c0e0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
2c0f0 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
2c100 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
2c110 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
2c120 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
2c130 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
2c140 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
2c150 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
2c160 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
2c170 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
2c180 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2c190 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
2c1a0 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
2c1b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
2c1c0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
2c1d0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
2c1e0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
2c1f0 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
2c200 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2c210 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
2c220 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
2c230 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
2c240 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
2c250 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
2c260 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
2c270 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c280 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
2c290 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
2c2a0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
2c2b0 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
2c2c0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
2c2d0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
2c2e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
2c2f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c300 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
2c310 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
2c320 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
2c330 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
2c340 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c350 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
2c360 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
2c370 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
2c380 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
2c390 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
2c3a0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2c3b0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
2c3c0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
2c3d0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
2c3e0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
2c3f0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
2c400 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
2c410 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
2c420 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
2c430 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
2c440 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
2c450 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
2c460 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
2c470 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
2c480 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
2c490 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
2c4a0 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
2c4b0 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
2c4c0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
2c4d0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
2c4e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
2c4f0 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
2c500 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
2c510 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
2c520 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
2c530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c540 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
2c550 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2c560 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
2c570 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
2c580 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
2c590 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
2c5a0 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
2c5b0 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
2c5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c5d0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
2c5e0 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
2c5f0 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
2c600 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
2c610 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
2c620 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
2c630 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c640 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
2c650 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2c660 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
2c670 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
2c680 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
2c690 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2c6a0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2c6b0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
2c6c0 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
2c6d0 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
2c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
2c6f0 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
2c700 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
2c710 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c720 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2c730 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2c740 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
2c750 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
2c760 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
2c770 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
2c780 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
2c790 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
2c7a0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
2c7b0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
2c7c0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
2c7d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c7e0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
2c7f0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2c800 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2c810 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2c820 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2c830 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2c840 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
2c850 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
2c860 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
2c870 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c880 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2c890 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
2c8a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2c8b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
2c8c0 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
2c8d0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2c8e0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2c8f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2c900 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
2c910 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
2c920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2c930 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2c940 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  red(pWInfo) ){. 
2c950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c970 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65  _Goto, 0, sqlite
2c980 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2c990 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
2c9a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c9b0 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
2c9c0 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
2c9d0 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45        (flag==WHE
2c9e0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
2c9f0 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
2ca00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca10 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2ca20 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2ca30 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
2ca40 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
2ca50 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2ca60 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72   }..      pOrder
2ca70 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
2ca80 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2ca90 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
2caa0 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
2cab0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2cac0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
2cad0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2cae0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
2caf0 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2cb10 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2cb20 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2cb30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2cb40 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2cb50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cb60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2cb70 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2cb80 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2cb90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2cba0 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2cbb0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2cbc0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2cbd0 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2cbe0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2cbf0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2cc00 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
2cc10 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2cc20 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2cc30 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
2cc40 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
2cc50 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
2cc60 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
2cc70 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
2cc80 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
2cc90 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
2cca0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2ccb0 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  e, "ORDER BY");.
2ccc0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
2ccd0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
2cce0 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
2ccf0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
2cd00 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2cd10 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
2cd20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2cd30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2cd40 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
2cd50 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
2cd60 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
2cd70 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
2cd80 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
2cd90 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
2cda0 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
2cdb0 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
2cdc0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
2cdd0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
2cde0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
2cdf0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
2ce00 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
2ce10 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
2ce20 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
2ce30 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
2ce40 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2ce50 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2ce60 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2ce70 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
2ce80 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
2ce90 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
2cea0 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
2ceb0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
2cec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ced0 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
2cee0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
2cef0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
2cf00 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2cf10 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
2cf20 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2cf30 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
2cf40 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
2cf50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
2cf60 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
2cf70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cf80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2cf90 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2cfa0 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
2cfb0 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
2cfc0 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74  eadable descript
2cfd0 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c  ion of a the Sel
2cfe0 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ect object..*/.s
2cff0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
2d000 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65  inOneSelect(Vdbe
2d010 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
2d020 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  *p){.  sqlite3Ex
2d030 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2d040 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20  e, "SELECT ");. 
2d050 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2d060 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2d070 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
2d080 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2d090 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2d0a0 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
2d0b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2d0c0 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43  (pVdbe, "DISTINC
2d0d0 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  T ");.    }.    
2d0e0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2d0f0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
2d100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2d110 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2d120 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29  be, "agg_flag ")
2d130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2d140 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2d150 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  be);.    sqlite3
2d160 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2d170 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d  dbe, "   ");.  }
2d180 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2d190 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2d1a0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73   p->pEList);.  s
2d1b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2d1c0 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d  pVdbe);.  if( p-
2d1d0 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
2d1e0 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e  ->nSrc ){.    in
2d1f0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
2d200 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2d210 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20  dbe, "FROM ");. 
2d220 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d230 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20  nPush(pVdbe);.  
2d240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2d250 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
2d260 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
2d270 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2d280 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
2d290 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
2d2a0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d2b0 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d  pVdbe, "{%d,*} =
2d2c0 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73   ", pItem->iCurs
2d2d0 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
2d2e0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
2d2f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d300 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56  ExplainSelect(pV
2d310 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  dbe, pItem->pSel
2d320 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
2d330 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
2d340 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d350 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d360 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d  pVdbe, " (tabnam
2d370 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70  e=%s)", pItem->p
2d380 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2d390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2d3a0 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
2d3b0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
2d3c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2d3d0 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c  ntf(pVdbe, "%s",
2d3e0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
2d3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d400 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
2d410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2d420 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d430 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73 29  pVdbe, " (AS %s)
2d440 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
2d450 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d460 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
2d470 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
2d480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d490 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2d4a0 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49  Vdbe, " LEFT-JOI
2d4b0 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  N");.      }.   
2d4c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d4d0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2d4e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2d4f0 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
2d500 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
2d510 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
2d520 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d530 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22 29  pVdbe, "WHERE ")
2d540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2d550 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2d560 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2d570 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2d580 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2d590 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
2d5a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2d5b0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2d5c0 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20  , "GROUPBY ");. 
2d5d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d5e0 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2d5f0 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
2d600 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d610 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2d620 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
2d630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2d640 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2d650 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a  be, "HAVING ");.
2d660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2d670 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2d680 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
2d690 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2d6a0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2d6b0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
2d6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2d6d0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d6e0 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20   "ORDERBY ");.  
2d6f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d700 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
2d710 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
2d720 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d730 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2d740 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
2d750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2d760 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2d770 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20  , "LIMIT ");.   
2d780 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2d790 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c  xpr(pVdbe, p->pL
2d7a0 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
2d7b0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2d7c0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2d7d0 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
2d7e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d7f0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46  intf(pVdbe, "OFF
2d800 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  SET ");.    sqli
2d810 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2d820 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  Vdbe, p->pOffset
2d830 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2d840 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2d850 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
2d860 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
2d870 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c  Vdbe *pVdbe, Sel
2d880 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
2d890 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2d8a0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d8b0 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65  pVdbe, "(null-se
2d8c0 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74  lect)");.    ret
2d8d0 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  urn;.  }.  while
2d8e0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2d8f0 20 20 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e     p->pPrior->pN
2d900 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d  ext = p;.    p =
2d910 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a   p->pPrior;.  }.
2d920 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d930 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
2d940 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
2d950 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
2d960 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
2d970 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
2d980 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
2d990 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
2d9a0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2d9b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2d9c0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2d9d0 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
2d9e0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
2d9f0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2da00 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2da10 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
2da20 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
2da30 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
2da40 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
2da50 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
2da60 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
2da70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2daa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dab0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
2dac0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2dad0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
2dae0 2a 2f 0a                                         */.