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

Artifact ab437f252415754963b1adfa501120d5364da3ef:


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 73    }else{.      s
b790: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b7a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b7b0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
b7c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
b7d0: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
b7e0: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
b7f0: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b800: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
b810: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
b820: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
b830: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
b840: 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70  * Given a an exp
b850: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
b860: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
b870: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
b880: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
b890: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
b8a0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
b8b0: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
b8c0: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
b8d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
b8e0: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
b8f0: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
b900: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
b910: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
b920: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
b930: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
b940: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b950: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
b960: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
b970: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
b980: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
b990: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
b9a0: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
b9b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
b9c0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
b9d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
b9e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
b9f0: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
ba00: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
ba10: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
ba20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
ba30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
ba40: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
ba50: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
ba60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ba70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
ba80: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
ba90: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
baa0: 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
bab0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
bac0: 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
bad0: 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
bae0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
baf0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
bb00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
bb10: 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
bb20: 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
bb30: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
bb40: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
bb50: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
bb60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bb70: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
bb80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
bb90: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bbb0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
bbc0: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
bbf0: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
bc00: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
bc10: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
bc20: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
bc30: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
bc40: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
bc50: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bc70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bc80: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
bc90: 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b  et */.  Expr *p;
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
bcc0: 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72  n for a single r
bcd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
bce0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd00: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
bd10: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd30: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
bd40: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69   zName[] */..  i
bd50: 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
bd60: 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
bd70: 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
bd80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
bd90: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
bda0: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
bdb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61  .    testcase( a
bdc0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  Col==0 );.  }els
bdd0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
bde0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
bdf0: 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43   }.  *pnCol = nC
be00: 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61  ol;.  *paCol = a
be10: 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c  Col;..  for(i=0,
be20: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
be30: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
be40: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
be50: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
be60: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
be70: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73      */.    p = s
be80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
be90: 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b  llate(pEList->a[
bea0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
beb0: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
bec0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
bed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
bee0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
bef0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
bf00: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
bf10: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
bf20: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
bf30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bf40: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
bf50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bf60: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
bf70: 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78   = p;  /* The ex
bf80: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
bf90: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
bfa0: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
bfb0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
bfc0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61        /* Table a
bfd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
bfe0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
bff0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
c000: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
c010: 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  DOT ){.        p
c020: 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
c030: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
c040: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c050: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
c060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
c070: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
c080: 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
c090: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
c0a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
c0b0: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
c0c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
c0d0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
c0e0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
c0f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
c100: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f        pTab = pCo
c110: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
c120: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c130: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
c140: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
c150: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
c160: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20  intf(db, "%s",. 
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
c190: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
c1a0: 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20   : "rowid");.   
c1b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
c1c0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
c1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c1e0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
c1f0: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
c200: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
c210: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
c220: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c230: 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72  , "%s", pColExpr
c240: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
c250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c260: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
c270: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
c280: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
c290: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
c2a0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
c2b0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c2c0: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69  f(db, "%s", pELi
c2d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
c2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c2f0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
c300: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
c310: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c320: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
c330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
c340: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
c350: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
c360: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
c370: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
c380: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
c390: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
c3a0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
c3b0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
c3c0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
c3d0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
c3e0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
c3f0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
c400: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
c410: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
c420: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
c430: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
c440: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
c450: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
c460: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
c470: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
c480: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
c490: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
c4a0: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
c4b0: 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a  if( zName[k]==':
c4c0: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20  ' ) nName = k;. 
c4d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
c4e0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
c4f0: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
c500: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c510: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
c520: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
c530: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c540: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
c550: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
c560: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
c570: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
c580: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
c590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c5a0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
c5b0: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
c5c0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c5d0: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
c5e0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
c5f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c600: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
c610: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
c620: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c630: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
c640: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
c650: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
c660: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
c680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c690: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
c6a0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
c6b0: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
c6c0: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
c6d0: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
c6e0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
c6f0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
c700: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
c710: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
c720: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
c730: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
c740: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
c750: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
c760: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
c770: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
c780: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
c790: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
c7a0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
c7b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c7c0: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
c7d0: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
c7e0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
c7f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
c800: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
c810: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
c820: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
c830: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
c840: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c850: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c860: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
c870: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
c880: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
c890: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
c8a0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
c8b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c8c0: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
c8d0: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
c8e0: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
c8f0: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
c900: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c910: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
c920: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
c930: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
c940: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
c950: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
c960: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
c970: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
c980: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
c990: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
c9a0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
c9b0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
c9c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
c9d0: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
c9e0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
c9f0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
ca00: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
ca10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
ca20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ca30: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
ca40: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
ca50: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ca60: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ca70: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ca80: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ca90: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
caa0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
cab0: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
cac0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
cad0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
cae0: 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d  pExpr;.    pCol-
caf0: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
cb00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
cb10: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cb20: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
cb30: 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  Est));.    szAll
cb40: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
cb50: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
cb60: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
cb70: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
cb80: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
cb90: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
cba0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
cbb0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
cbc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
cbd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
cbe0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
cbf0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
cc00: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
cc10: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
cc20: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
cc30: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
cc40: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
cc50: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
cc60: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
cc70: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
cc80: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
cc90: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
cca0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
ccb0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
ccc0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
ccd0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
cce0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
ccf0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
cd00: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
cd10: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
cd20: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
cd30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cd40: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
cd50: 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
cd60: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
cd70: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
cd80: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
cd90: 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
cda0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
cdb0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
cdc0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
cdd0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
cde0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
cdf0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
ce00: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
ce10: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
ce20: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
ce30: 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
ce40: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
ce50: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
ce60: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ce70: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
ce80: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
ce90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cea0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
ceb0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
cec0: 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
ced0: 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
cee0: 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
cef0: 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
cf00: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
cf10: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
cf20: 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70  nabled==0 );.  p
cf30: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
cf40: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
cf50: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73  ;.  pTab->nRowEs
cf60: 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 73  t = 1048576;.  s
cf70: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
cf80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
cf90: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
cfa0: 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
cfb0: 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  pTab->aCol);.  s
cfc0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
cfd0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
cfe0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
cff0: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
d000: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
d010: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d020: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
d030: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
d040: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
d050: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
d060: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
d070: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
d080: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
d090: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
d0a0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
d0b0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
d0c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
d0d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
d0e0: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
d0f0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
d100: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
d110: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
d120: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
d130: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
d140: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
d150: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
d160: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
d170: 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a  Create(pParse);.
d180: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d190: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
d1a0: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ( v ){.      sql
d1b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
d1c0: 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20  , OP_Trace);.   
d1d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
d1e0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
d1f0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
d200: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
d210: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
d220: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
d230: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
d240: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
d250: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
d260: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
d270: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
d280: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
d290: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
d2a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
d2b0: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
d2c0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
d2d0: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
d2e0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
d2f0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
d300: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
d310: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
d320: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
d330: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
d340: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
d350: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
d360: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
d370: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
d380: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
d390: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
d3a0: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
d3b0: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
d3c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
d3d0: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
d3e0: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
d3f0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
d400: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
d410: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
d420: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
d430: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
d440: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
d450: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
d460: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
d470: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
d480: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
d490: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
d4a0: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
d4b0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
d4c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
d4d0: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
d4e0: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
d4f0: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
d500: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
d510: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
d520: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
d530: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
d540: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
d550: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
d560: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
d570: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
d580: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
d590: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d5a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d5b0: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
d5c0: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
d5d0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
d5e0: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
d5f0: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
d600: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
d610: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
d620: 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20   int addr1, n;. 
d630: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
d640: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
d650: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
d660: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
d670: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
d680: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
d690: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
d6a0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
d6b0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
d6c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
d6d0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
d6e0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
d6f0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
d700: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
d710: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
d720: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
d730: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d740: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
d750: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
d760: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
d770: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
d780: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
d790: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
d7a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d7b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
d7c0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
d7d0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45  return;  /* VDBE
d7e0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
d7f0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
d800: 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ted */.    if( s
d810: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
d820: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
d830: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
d840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d850: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
d860: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
d870: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d880: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
d890: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
d8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d8b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d8c0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
d8d0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
d8e0: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
d8f0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
d900: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
d910: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
d920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d930: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
d940: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d950: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
d960: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
d970: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d980: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
d990: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
d9a0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
d9b0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
d9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d9e0: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
d9f0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
da00: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
da10: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
da20: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
da30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
da40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
da50: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
da60: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
da70: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
da80: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
da90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
daa0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
dab0: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
dac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dad0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
dae0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
daf0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
db00: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
db10: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
db20: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
db30: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
db40: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
db50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
db70: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
db80: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
db90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dba0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
dbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dbc0: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
dbd0: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
dbe0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
dbf0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dc00: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
dc10: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
dc20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dc30: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
dc40: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
dc50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc60: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
dc70: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
dc80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dc90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
dca0: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
dcb0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
dcc0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
dcd0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
dce0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
dcf0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
dd00: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
dd10: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
dd20: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
dd30: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
dd40: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
dd50: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
dd60: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
dd70: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
dd80: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
dd90: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
dda0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
ddb0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
ddc0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
ddd0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
dde0: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
ddf0: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
de00: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
de10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
de20: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
de30: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
de40: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
de50: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
de60: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
de70: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
de80: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
de90: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
dea0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
deb0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
dec0: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
ded0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
dee0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
def0: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
df00: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
df10: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
df20: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
df30: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
df40: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
df50: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
df60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
df70: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
df80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
df90: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
dfa0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
dfb0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
dfc0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
dfd0: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
dfe0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dff0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e000: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e010: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
e020: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
e030: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
e040: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
e050: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
e060: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
e070: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
e080: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
e090: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e0a0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
e0b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e0c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e0d0: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
e0e0: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
e0f0: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
e100: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
e110: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
e120: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
e130: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
e140: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
e150: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
e160: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
e170: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
e180: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
e190: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
e1a0: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
e1b0: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
e1c0: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
e1d0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
e1e0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
e1f0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
e200: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
e210: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
e220: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
e230: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
e240: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
e250: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
e260: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
e270: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
e280: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
e290: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
e2a0: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
e2b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
e2c0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
e2d0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
e2e0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
e2f0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
e300: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
e310: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
e320: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
e330: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
e340: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
e350: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
e360: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
e370: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
e380: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
e3b0: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
e3c0: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
e3d0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
e3e0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
e3f0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
e400: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
e410: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e420: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
e430: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
e440: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
e450: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
e460: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
e470: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
e480: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
e490: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
e4a0: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
e4b0: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
e4c0: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
e4d0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
e4e0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
e4f0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
e500: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
e510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
e520: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
e530: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e540: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e550: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
e560: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e570: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
e580: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
e590: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
e5a0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
e5b0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
e5c0: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
e5d0: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
e5e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e5f0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
e600: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
e610: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
e620: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
e630: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
e640: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
e650: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
e660: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
e670: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
e680: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
e690: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
e6a0: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
e6b0: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
e6c0: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
e6d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
e6e0: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
e6f0: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
e700: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
e710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e730: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e740: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e750: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
e760: 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
e770: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
e780: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
e790: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
e7a0: 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
e7b0: 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
e7c0: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
e7d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
e7e0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
e7f0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
e800: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
e810: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
e820: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
e830: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
e840: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
e850: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
e860: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
e870: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
e880: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
e890: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
e8a0: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
e8b0: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
e8c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52  .  assert( p->pR
e8d0: 65 63 75 72 73 65 3d 3d 30 20 7c 7c 20 70 2d 3e  ecurse==0 || p->
e8e0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
e8f0: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
e900: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
e910: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
e920: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
e930: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
e940: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
e950: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
e960: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
e970: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
e980: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
e990: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
e9a0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e9b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e9c0: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
e9d0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
e9e0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
e9f0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
ea00: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ea10: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
ea20: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
ea30: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
ea40: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
ea50: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
ea60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ea70: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
ea80: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
ea90: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
eaa0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
eab0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
eac0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
ead0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
eae0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
eaf0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
eb00: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
eb10: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
eb20: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
eb30: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
eb40: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
eb50: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
eb60: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
eb70: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
eb80: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
eb90: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
eba0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
ebb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
ebc0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
ebd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ebe0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
ebf0: 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
ec00: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
ec10: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
ec20: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
ec30: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
ec40: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
ec50: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
ec60: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
ec70: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
ec80: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
ec90: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
eca0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
ecb0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
ecc0: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
ecd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
ece0: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
ecf0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
ed00: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ed10: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
ed20: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
ed30: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
ed40: 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
ed50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ed60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
ed70: 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
ed80: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
ed90: 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
eda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
edb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
edc0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
edd0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
ede0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
edf0: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
ee00: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
ee10: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
ee20: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
ee30: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
ee40: 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20   }.    rc = 1;. 
ee50: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ee60: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23  lect_end;.  }..#
ee70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee80: 49 54 5f 43 54 45 0a 20 20 2f 2a 20 49 66 20 74  IT_CTE.  /* If t
ee90: 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
eea0: 76 65 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20  ve query, check 
eeb0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
eec0: 20 4f 52 44 45 52 20 42 59 20 6f 72 0a 20 20 2a   ORDER BY or.  *
eed0: 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20  * LIMIT clause. 
eee0: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
eef0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
ef00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ef10: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
ef20: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 69 66  ->pLimit );.  if
ef30: 28 20 70 2d 3e 70 52 65 63 75 72 73 65 20 26 26  ( p->pRecurse &&
ef40: 20 28 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c   (p->pOrderBy ||
ef50: 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b 0a 20   p->pLimit) ){. 
ef60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ef70: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 20 69  sg(pParse, "%s i
ef80: 6e 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  n a recursive qu
ef90: 65 72 79 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ery is not allow
efa0: 65 64 22 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e  ed",.        p->
efb0: 70 4f 72 64 65 72 42 79 20 3f 20 22 4f 52 44 45  pOrderBy ? "ORDE
efc0: 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 0a  R BY" : "LIMIT".
efd0: 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
efe0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
eff0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
f000: 70 52 65 63 75 72 73 65 20 29 7b 0a 20 20 20 20  pRecurse ){.    
f010: 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
f020: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
f030: 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20   int addrNext;. 
f040: 20 20 20 69 6e 74 20 61 64 64 72 53 77 61 70 3b     int addrSwap;
f050: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20  .    int iCont, 
f060: 69 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e 74 20  iBreak;.    int 
f070: 74 6d 70 31 2c 20 74 6d 70 32 3b 20 20 20 20 20  tmp1, tmp2;     
f080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
f090: 73 6f 72 73 20 75 73 65 64 20 74 6f 20 61 63 63  sors used to acc
f0a0: 65 73 73 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ess temporary ta
f0b0: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
f0c0: 74 6d 70 33 20 3d 20 30 3b 20 20 20 20 20 20 20  tmp3 = 0;       
f0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
f0e0: 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65  ensure unique re
f0f0: 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a  sults if UNION *
f100: 2f 0a 20 20 20 20 69 6e 74 20 65 44 65 73 74 20  /.    int eDest 
f110: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 20  = SRT_Table;.   
f120: 20 53 65 6c 65 63 74 44 65 73 74 20 74 6d 70 32   SelectDest tmp2
f130: 64 65 73 74 3b 0a 0a 20 20 20 20 69 42 72 65 61  dest;..    iBrea
f140: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f150: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f160: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
f170: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f180: 3b 0a 0a 20 20 20 20 74 6d 70 31 20 3d 20 70 50  ;..    tmp1 = pP
f190: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f1a0: 20 20 74 6d 70 32 20 3d 20 70 50 61 72 73 65 2d    tmp2 = pParse-
f1b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28  >nTab++;.    if(
f1c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
f1d0: 20 29 7b 0a 20 20 20 20 20 20 65 44 65 73 74 20   ){.      eDest 
f1e0: 3d 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3b  = SRT_DistTable;
f1f0: 0a 20 20 20 20 20 20 74 6d 70 33 20 3d 20 70 50  .      tmp3 = pP
f200: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f210: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
f220: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 74  electDestInit(&t
f230: 6d 70 32 64 65 73 74 2c 20 65 44 65 73 74 2c 20  mp2dest, eDest, 
f240: 74 6d 70 32 29 3b 0a 0a 20 20 20 20 73 71 6c 69  tmp2);..    sqli
f250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f260: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f270: 6c 2c 20 74 6d 70 31 2c 20 6e 43 6f 6c 29 3b 0a  l, tmp1, nCol);.
f280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f290: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f2a0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 32 2c  Ephemeral, tmp2,
f2b0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   nCol);.    if( 
f2c0: 74 6d 70 33 20 29 7b 0a 20 20 20 20 20 20 70 2d  tmp3 ){.      p-
f2d0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
f2e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f300: 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 33 2c 20  phemeral, tmp3, 
f310: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c  0);.      p->sel
f320: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
f330: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 7d  Ephemeral;.    }
f340: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
f350: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
f360: 65 20 69 6e 69 74 69 61 6c 20 53 45 4c 45 43 54  e initial SELECT
f370: 20 69 6e 20 74 6d 70 32 2e 20 2a 2f 0a 20 20 20   in tmp2. */.   
f380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f390: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
f3a0: 6f 72 2c 20 26 74 6d 70 32 64 65 73 74 29 3b 0a  or, &tmp2dest);.
f3b0: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
f3c0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f3d0: 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  nd;..    /* Clea
f3e0: 72 20 74 6d 70 31 2e 20 54 68 65 6e 20 73 77 69  r tmp1. Then swi
f3f0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  tch the contents
f400: 20 6f 66 20 74 6d 70 31 20 61 6e 64 20 74 6d 70   of tmp1 and tmp
f410: 32 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 0a  2. Then return .
f420: 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
f430: 6e 74 73 20 6f 66 20 74 6d 70 31 20 74 6f 20 74  nts of tmp1 to t
f440: 68 65 20 63 61 6c 6c 65 72 2e 20 4f 72 2c 20 69  he caller. Or, i
f450: 66 20 74 6d 70 31 20 69 73 20 65 6d 70 74 79 20  f tmp1 is empty 
f460: 61 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  at this.    ** p
f470: 6f 69 6e 74 2c 20 74 68 65 20 72 65 63 75 72 73  oint, the recurs
f480: 69 76 65 20 71 75 65 72 79 20 68 61 73 20 66 69  ive query has fi
f490: 6e 69 73 68 65 64 20 2d 20 6a 75 6d 70 20 74 6f  nished - jump to
f4a0: 20 61 64 64 72 65 73 73 20 69 42 72 65 61 6b 2e   address iBreak.
f4b0: 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 53 77 61    */.    addrSwa
f4c0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
f4d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 77 61 70  ddOp2(v, OP_Swap
f4e0: 43 75 72 73 6f 72 73 2c 20 74 6d 70 31 2c 20 74  Cursors, tmp1, t
f4f0: 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mp2);.    sqlite
f500: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f510: 50 5f 52 65 77 69 6e 64 2c 20 74 6d 70 31 2c 20  P_Rewind, tmp1, 
f520: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 61 64 64  iBreak);.    add
f530: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
f540: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f550: 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
f560: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
f570: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 6d 70  , p->pEList, tmp
f580: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
f590: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 30 2c 20  xpr,.        0, 
f5a0: 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
f5b0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71   iBreak);.    sq
f5c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f5d0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
f5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f5f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f600: 74 2c 20 74 6d 70 31 2c 20 61 64 64 72 4e 65 78  t, tmp1, addrNex
f610: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 65 63  t);..    /* Exec
f620: 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
f630: 65 20 53 45 4c 45 43 54 2e 20 53 74 6f 72 65 20  e SELECT. Store 
f640: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
f650: 6d 70 32 2e 20 57 68 69 6c 65 20 74 68 69 73 0a  mp2. While this.
f660: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 69 73      ** SELECT is
f670: 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 20 63 6f   running, the co
f680: 6e 74 65 6e 74 73 20 6f 66 20 74 6d 70 31 20 61  ntents of tmp1 a
f690: 72 65 20 72 65 61 64 20 62 79 20 72 65 63 75 72  re read by recur
f6a0: 73 69 76 65 20 0a 20 20 20 20 2a 2a 20 72 65 66  sive .    ** ref
f6b0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
f6c0: 75 72 72 65 6e 74 20 43 54 45 2e 20 20 2a 2f 0a  urrent CTE.  */.
f6d0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
f6e0: 30 3b 0a 20 20 20 20 70 2d 3e 70 52 65 63 75 72  0;.    p->pRecur
f6f0: 73 65 2d 3e 74 6e 75 6d 20 3d 20 74 6d 70 31 3b  se->tnum = tmp1;
f700: 0a 20 20 20 20 70 2d 3e 70 52 65 63 75 72 73 65  .    p->pRecurse
f710: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
f720: 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
f730: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
f740: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 74  ct(pParse, p, &t
f750: 6d 70 32 64 65 73 74 29 3b 0a 20 20 20 20 70 2d  mp2dest);.    p-
f760: 3e 70 52 65 63 75 72 73 65 2d 3e 74 61 62 46 6c  >pRecurse->tabFl
f770: 61 67 73 20 26 3d 20 7e 54 46 5f 52 65 63 75 72  ags &= ~TF_Recur
f780: 73 69 76 65 3b 0a 20 20 20 20 70 2d 3e 70 50 72  sive;.    p->pPr
f790: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f7a0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
f7b0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f7c0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
f7d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
f7e0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 77 61 70  oto, 0, addrSwap
f7f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f800: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f810: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 65 6c  , iBreak);.  }el
f820: 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
f830: 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
f840: 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
f850: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
f860: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
f870: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
f880: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
f890: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
f8a0: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
f8b0: 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
f8c0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
f8d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f8e0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
f8f0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
f900: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
f910: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
f920: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
f930: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
f940: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
f950: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
f960: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
f970: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
f980: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
f990: 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
f9a0: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
f9b0: 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
f9c0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
f9d0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
f9e0: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
f9f0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
fa00: 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
fa10: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
fa20: 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
fa30: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
fa40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fa50: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
fa60: 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
fa70: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
fa80: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
fa90: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
faa0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fab0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fac0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
fad0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
fae0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
faf0: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
fb00: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
fb10: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
fb20: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
fb30: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
fb40: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
fb50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb60: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
fb70: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
fb80: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
fb90: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
fba0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
fbb0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
fbc0: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
fbd0: 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
fbe0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
fbf0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
fc00: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
fc10: 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
fc20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fc30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
fc40: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
fc50: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
fc60: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
fc70: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
fc80: 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
fc90: 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
fca0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
fcb0: 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
fcc0: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
fcd0: 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
fce0: 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
fcf0: 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
fd00: 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
fd10: 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69  ctRow > (u64)nLi
fd20: 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  mit .      ){.  
fd30: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
fd40: 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  Row = nLimit;.  
fd50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fd60: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
fd70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fd80: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
fd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
fda0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
fdb0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
fdc0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
fdd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
fde0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
fdf0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
fe00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fe10: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
fe20: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
fe30: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
fe40: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
fe50: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
fe60: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
fe70: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
fe80: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
fe90: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
fea0: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
feb0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
fec0: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
fed0: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
fee0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
fef0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
ff00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
ff10: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
ff20: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
ff30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ff40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
ff50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ff60: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
ff70: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
ff80: 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
ff90: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
ffa0: 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
ffb0: 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c  && ALWAYS(!p->pL
ffc0: 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73  imit &&!p->pOffs
ffd0: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  et) ){.        /
ffe0: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
fff0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10000 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
10010 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
10020 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
10030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10040 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
10050 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20  ightmost!=p );  
10060 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
10070 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20  en for leftward 
10080 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20  elements.       
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
100b0 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d   of a 3-way or m
100c0 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ore compound */.
100d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
100e0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
100f0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
10100 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
10110 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
10120 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10130 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
10140 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
10150 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
10160 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
10170 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
10180 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
10190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
101a0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
101b0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
101c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
101d0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
101e0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
101f0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
10200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10210 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
10220 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10230 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
10240 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
10250 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10270 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10280 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
10290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
102a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
102b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
102c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
102d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
102e0 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
102f0 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
10300 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
10310 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
10320 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10330 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10340 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
10350 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
10360 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
10370 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10380 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
10390 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
103a0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
103b0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
103c0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
103d0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
103e0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
103f0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
10400 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
10410 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10420 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
10430 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
10440 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10450 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10460 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10470 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10480 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
10490 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
104a0 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
104b0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
104c0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
104d0 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
104e0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
104f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10500 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
10510 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
10520 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
10530 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
10540 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
10550 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
10560 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10570 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
10580 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
10590 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
105a0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
105b0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
105c0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
105d0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
105e0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
105f0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
10600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
10610 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
10620 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
10630 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
10650 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
10660 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
10670 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
10680 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
10690 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
106a0 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
106b0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
106c0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
106d0 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
106e0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
106f0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
10700 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
10710 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
10720 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
10730 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
10740 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
10750 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
10760 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
10770 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
10780 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
10790 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
107a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
107b0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
107c0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
107d0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
107e0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
107f0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
10800 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
10810 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
10820 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
10830 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
10840 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
10850 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
10860 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
10870 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
10880 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
10890 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
108a0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
108b0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
108c0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
108d0 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
108e0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
108f0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
10900 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
10910 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
10920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10930 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
10940 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10950 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
10960 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
10970 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
10980 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
10990 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
109a0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
109b0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
109c0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
109d0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
109e0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
109f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
10a00 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
10a10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10a20 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
10a30 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
10a40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10a50 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
10a60 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
10a70 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
10a80 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
10a90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10aa0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
10ab0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
10ac0 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
10ad0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10ae0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
10af0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
10b00 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
10b10 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
10b20 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
10b30 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10b50 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
10b60 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10b80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
10b90 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
10ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10bb0 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
10bc0 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
10bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10be0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10bf0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c10 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
10c20 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
10c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10c40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
10c50 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
10c60 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
10c70 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
10c80 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
10c90 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
10ca0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
10cb0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
10cc0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
10cd0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
10ce0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
10cf0 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
10d00 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
10d10 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
10d20 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
10d30 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
10d40 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
10d50 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
10d60 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
10d70 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
10d80 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
10d90 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
10da0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
10db0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
10dc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
10dd0 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
10de0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
10df0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10e00 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
10e10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
10e20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
10e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e40 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
10e50 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
10e60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e70 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10e80 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
10e90 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
10ea0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
10eb0 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
10ec0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
10ed0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
10ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10ef0 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
10f00 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
10f10 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
10f20 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
10f30 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
10f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
10f50 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
10f60 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
10f70 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
10f80 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
10f90 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
10fa0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
10fb0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
10fc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10fd0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
10fe0 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
10ff0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
11000 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
11010 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
11020 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
11030 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
11040 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
11050 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
11060 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
11070 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
11080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11090 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
110a0 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
110b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
110c0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
110d0 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
110e0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
110f0 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
11100 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
11110 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
11120 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
11130 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
11140 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
11150 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
11160 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
11170 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
11180 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
11190 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
111a0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
111b0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
111c0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
111d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
111e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
111f0 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
11200 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
11210 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
11220 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
11230 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
11240 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
11250 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
11260 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
11270 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
11280 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
11290 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
112a0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
112b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
112c0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
112d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
112e0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
112f0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
11300 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
11310 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11320 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
11330 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
11340 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
11350 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
11360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11370 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
11380 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
11390 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
113a0 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
113b0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
113c0 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
113d0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
113e0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
113f0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
11400 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
11410 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11420 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
11430 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
11440 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
11450 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11460 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
11470 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11480 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
11490 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
114a0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
114b0 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
114c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114d0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
114e0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
114f0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
11500 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11510 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
11520 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
11530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
11540 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
11550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11560 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
11570 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
11580 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
11590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
115a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
115b0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
115c0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
115d0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
115e0 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
115f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
11620 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
11630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11640 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11650 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
11660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11670 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
11680 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
11690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
116a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
116b0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
116c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
116d0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
116e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
116f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11700 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
11710 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
11730 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
11740 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
11750 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
11760 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
11770 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
11780 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
11790 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
117a0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
117b0 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
117c0 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
117d0 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
117e0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
117f0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
11800 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
11810 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
11820 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
11830 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
11840 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
11850 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
11860 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
11870 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
11880 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
11890 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
118a0 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
118b0 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
118c0 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
118d0 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
118e0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
118f0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
11900 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
11910 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
11920 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
11930 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
11940 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11960 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11970 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
11980 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
11990 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
119a0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
119b0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
119c0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119e0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
119f0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
11a00 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
11a10 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
11a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11a30 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11a40 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
11a50 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
11a60 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
11a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11a80 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11a90 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
11aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11ab0 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
11ac0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
11ad0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
11ae0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
11af0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
11b00 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
11b10 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
11b20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
11b30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11b40 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11b50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
11b60 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
11b70 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
11b80 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
11b90 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
11ba0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
11bb0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11bc0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
11bd0 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
11be0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
11bf0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
11c00 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
11c10 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
11c20 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
11c30 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
11c40 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
11c50 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
11c60 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
11c70 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
11c80 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
11c90 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
11ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
11cb0 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
11cc0 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
11cd0 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
11ce0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
11cf0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
11d00 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
11d10 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
11d20 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
11d30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
11d40 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
11d50 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
11d60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11d90 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
11da0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
11db0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
11dc0 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
11dd0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
11de0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
11e10 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
11e20 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11e30 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
11e40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11e50 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
11e60 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
11e70 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
11e80 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
11e90 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
11ea0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
11eb0 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
11ec0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
11ed0 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
11ee0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11ef0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11f00 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
11f10 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
11f20 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
11f30 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
11f40 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
11f50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
11f60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
11f70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
11f80 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
11f90 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
11fa0 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
11fb0 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
11fc0 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
11fd0 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
11fe0 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
11ff0 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
12000 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
12010 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
12020 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
12030 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
12040 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
12050 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
12060 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
12070 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
12080 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
12090 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
120a0 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
120b0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
120c0 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
120d0 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
120e0 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
120f0 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
12100 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
12110 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
12120 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
12130 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
12140 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
12150 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
12160 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
12170 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
12180 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
12190 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
121a0 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
121b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
121c0 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
121d0 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
121e0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
121f0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
12200 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
12210 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12220 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12240 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
12250 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
12260 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
12270 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
12280 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
12290 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
122a0 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
122b0 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
122c0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
122d0 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
122e0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
122f0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
12300 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
12310 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
12320 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
12330 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
12340 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
12350 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12360 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
12370 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
12380 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
12390 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123b0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
123c0 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
123d0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
123e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
123f0 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
12400 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
12410 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12420 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12430 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
12440 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12450 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
12460 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
12470 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
12480 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
12490 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
124a0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
124b0 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
124c0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
124d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
124e0 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
124f0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
12500 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
12510 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
12520 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
12530 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
12560 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
12570 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
12580 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
12590 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
125a0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
125b0 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
125c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
125d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
125e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
125f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
12600 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
12610 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
12620 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
12630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12640 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12650 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
12660 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
12670 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12680 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
12690 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
126a0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
126b0 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
126c0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
126d0 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
126e0 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
126f0 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
12700 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
12710 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
12720 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
12730 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
12740 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
12750 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
12760 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
12770 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
12780 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
12790 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
127a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
127b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
127c0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
127d0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
127e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
127f0 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
12800 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
12810 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
12820 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
12830 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12840 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
12850 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
12860 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
12870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12880 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
12890 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
128a0 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
128b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
128c0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
128d0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
128e0 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
128f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12900 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
12910 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
12920 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12930 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
12940 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
12950 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12960 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
12970 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
12980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12990 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
129a0 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
129b0 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
129c0 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
129d0 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
129e0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
129f0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
12a00 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
12a10 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
12a20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
12a30 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
12a40 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
12a50 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
12a60 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
12a70 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
12a80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
12a90 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
12aa0 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
12ab0 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
12ac0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
12ad0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
12ae0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
12af0 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
12b00 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
12b10 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12b30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12b40 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
12b50 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
12b60 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
12b70 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
12b80 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
12b90 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
12ba0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
12bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12bc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12bd0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
12be0 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
12bf0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
12c00 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12c10 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
12c20 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
12c30 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
12c40 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
12c50 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
12c60 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
12c70 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
12c80 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
12c90 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
12ca0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12cb0 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
12cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12cd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12ce0 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
12cf0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
12d00 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
12d10 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
12d20 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
12d30 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
12d40 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12d50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
12d60 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
12d70 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
12d80 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
12d90 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
12da0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12db0 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
12dc0 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
12dd0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
12de0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
12df0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
12e00 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
12e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12e20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
12e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12e40 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
12e50 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
12e60 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
12e70 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
12e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
12e90 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
12ea0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
12eb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12ec0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
12ed0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12ee0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
12ef0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
12f00 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
12f10 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
12f20 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
12f30 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
12f40 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
12f50 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
12f60 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
12f70 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
12f80 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
12f90 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
12fb0 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
12fc0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
12fd0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
12fe0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
12ff0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
13000 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
13010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13020 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
13030 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
13040 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  st->iSdst, pDest
13050 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
13060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13070 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
13080 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
13090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
130a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
130b0 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
130c0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
130d0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
130e0 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
130f0 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
13100 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13110 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
13120 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
13130 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
13140 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
13150 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
13160 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
13170 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
13180 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
13190 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
131a0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
131b0 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
131c0 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
131d0 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
131e0 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
131f0 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
13200 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
13210 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
13220 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
13230 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
13240 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
13250 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
13260 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
13270 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13280 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
13290 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
132a0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
132b0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
132c0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
132d0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
132e0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
132f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13300 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
13310 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
13320 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
13330 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
13340 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
13350 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
13360 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13370 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
13380 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
13390 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
133a0 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
133b0 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
133c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
133d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
133e0 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
133f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13400 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
13410 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
13420 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
13430 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
13440 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
13450 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
13460 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
13470 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
13480 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
13490 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
134a0 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
134b0 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
134c0 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
134d0 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
134e0 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
134f0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
13500 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
13510 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
13520 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
13530 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
13540 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
13550 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
13560 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
13570 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
13580 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
13590 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
135a0 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
135b0 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
135c0 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
135d0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
135e0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
135f0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
13600 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
13610 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
13620 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
13630 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
13640 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
13650 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
13660 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
13670 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
13680 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
13690 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
136a0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
136b0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
136c0 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
136d0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
136e0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
136f0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
13700 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
13710 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
13720 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
13730 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
13740 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
13750 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
13760 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
13770 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
13780 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
13790 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
137a0 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
137b0 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
137c0 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
137d0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
137e0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
137f0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
13800 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
13810 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
13820 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
13830 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
13840 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
13850 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
13860 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
13870 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
13880 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
13890 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
138a0 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
138b0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
138c0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
138d0 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
138e0 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
138f0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
13900 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
13910 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
13920 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
13930 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
13940 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
13950 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
13960 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
13970 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
13980 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
13990 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
139a0 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
139b0 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
139c0 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
139d0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
139e0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
139f0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
13a00 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
13a10 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
13a20 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
13a30 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
13a40 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
13a50 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
13a60 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
13a70 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
13a80 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
13a90 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
13aa0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
13ab0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
13ac0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
13ad0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13ae0 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
13af0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
13b00 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
13b10 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
13b20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
13b30 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
13b40 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
13b50 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
13b60 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
13b70 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
13b80 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
13b90 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
13ba0 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
13bb0 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
13bc0 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
13bd0 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
13be0 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
13bf0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
13c00 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
13c10 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
13c20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
13c30 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
13c40 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
13c50 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
13c60 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
13c70 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
13c80 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
13c90 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
13ca0 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
13cb0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
13cc0 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
13cd0 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
13ce0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
13cf0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
13d00 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
13d10 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
13d20 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
13d30 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
13d40 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
13d50 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
13d60 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
13d70 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
13d80 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
13d90 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
13da0 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
13db0 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
13dc0 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
13dd0 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
13de0 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
13df0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13e00 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
13e10 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
13e20 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
13e30 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
13e40 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
13e50 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
13e60 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
13e70 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
13e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
13e90 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
13ea0 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
13eb0 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
13ec0 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
13ed0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
13ee0 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
13ef0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
13f00 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
13f10 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
13f20 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
13f30 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
13f40 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
13f50 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
13f60 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
13f70 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
13f80 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
13f90 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
13fa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
13fb0 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
13fc0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
13fd0 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
13fe0 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
13ff0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
14000 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
14010 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
14020 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
14030 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
14040 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
14050 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
14060 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
14070 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
14080 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
14090 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
140a0 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
140b0 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
140c0 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
140d0 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
140e0 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
140f0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
14100 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
14110 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
14120 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
14130 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
14140 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
14150 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
14160 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
14170 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
14180 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
14190 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
141a0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
141b0 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
141c0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
141d0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
141e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
141f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14200 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14210 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14220 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
14230 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
14240 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
14250 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
14260 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
14270 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
14280 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
14290 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
142a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
142b0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
142c0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
142d0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
142e0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
142f0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
14300 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
14310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14320 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
14330 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
14340 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
14350 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
14360 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
14370 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
14380 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
14390 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
143a0 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
143b0 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
143c0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
143d0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
143e0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
143f0 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20  nt regEofA;     
14400 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
14410 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
14420 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65  lect-A is comple
14430 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  te */.  int regA
14440 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
14450 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
14460 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
14470 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
14480 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20  t regEofB;      
14490 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
144a0 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
144b0 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74  ect-B is complet
144c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
144d0 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
144e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
144f0 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
14500 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
14510 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
14520 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
14530 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
14540 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
14550 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
14560 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
14570 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
14580 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
14590 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
145a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
145b0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
145c0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
145d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
145e0 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
145f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14600 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
14610 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
14620 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
14630 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
14640 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
14650 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
14660 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
14670 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14680 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
14690 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
146a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
146b0 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
146c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
146d0 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
146e0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
146f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
14700 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
14710 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
14720 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
14730 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
14740 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
14750 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
14760 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
14770 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
14780 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
14790 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
147a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
147b0 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
147c0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
147d0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
147e0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
147f0 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
14800 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
14810 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
14820 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
14830 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
14840 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
14850 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
14860 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
14870 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
14880 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
14890 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
148a0 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
148b0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
148c0 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
148d0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
148e0 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
148f0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
14900 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
14910 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
14920 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
14930 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
14940 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
14950 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
14960 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
14970 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
14980 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
14990 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
149a0 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
149b0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
149c0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
149d0 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
149e0 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
149f0 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
14a00 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
14a10 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
14a20 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
14a30 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
14a40 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
14a50 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
14a60 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
14a70 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
14a80 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
14a90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
14aa0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14ab0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14ac0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
14ad0 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
14ae0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14af0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
14b00 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
14b10 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
14b20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14b30 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
14b40 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
14b50 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
14b60 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
14b70 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
14b80 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
14b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
14ba0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
14bc0 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
14bd0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
14be0 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
14bf0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
14c00 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
14c10 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
14c20 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
14c30 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
14c40 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
14c50 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
14c60 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
14c70 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
14c80 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
14c90 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
14ca0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
14cb0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
14cc0 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
14cd0 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
14ce0 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
14cf0 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
14d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14d10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
14d20 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
14d30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14d40 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
14d50 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
14d60 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
14d70 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
14d80 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
14d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
14da0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
14db0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
14dc0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
14dd0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
14de0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
14df0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
14e00 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
14e10 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
14e20 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
14e30 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
14e40 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
14e50 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
14e60 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
14e70 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
14e80 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
14e90 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
14ea0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
14eb0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
14ec0 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
14ed0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
14ee0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
14ef0 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
14f00 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14f10 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
14f20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14f30 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
14f40 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
14f50 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
14f60 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
14f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14f80 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
14f90 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
14fa0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
14fb0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
14fc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
14fd0 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
14fe0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
14ff0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
15000 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
15010 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
15020 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
15030 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15050 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
15060 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
15070 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
15080 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
15090 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
150a0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
150b0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
150c0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
150d0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
150e0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
150f0 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
15100 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
15110 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
15120 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
15130 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
15140 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
15150 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
15160 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
15170 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
15180 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
15190 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
151a0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
151b0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
151c0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
151d0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
151e0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
151f0 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
15200 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
15210 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
15220 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
15230 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
15240 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
15250 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
15260 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
15270 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
15280 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
15290 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
152a0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
152b0 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
152c0 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
152d0 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
152e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
152f0 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
15300 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
15310 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
15320 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
15330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15340 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
15350 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20  ByCol>0.        
15360 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e    && pItem->u.x.
15370 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
15380 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
15390 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
153a0 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
153b0 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
153c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
153d0 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33 4b 65  erge = sqlite3Ke
153e0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
153f0 4f 72 64 65 72 42 79 2c 20 31 29 3b 0a 20 20 20  OrderBy, 1);.   
15400 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
15410 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
15420 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
15430 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
15440 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
15450 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
15460 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15470 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
15480 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
15490 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
154a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
154b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
154c0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65  lSeq(pParse, pTe
154d0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rm);.        }el
154e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
154f0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
15500 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
15510 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29   p, aPermute[i])
15520 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15530 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
15540 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15550 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 64  ;.          pOrd
15560 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
15570 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
15580 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
15590 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
155a0 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
155b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
155c0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
155d0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
155e0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
155f0 65 79 4d 65 72 67 65 29 20 29 3b 0a 20 20 20 20  eyMerge) );.    
15600 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
15610 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
15620 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
15630 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ge->aSortOrder[i
15640 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
15650 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
15660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
15670 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
15680 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
15690 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
156a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
156b0 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
156c0 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
156d0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
156e0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
156f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15700 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
15710 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
15720 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
15730 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
15740 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
15750 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
15760 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
15770 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
15780 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
15790 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
157a0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
157b0 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
157c0 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
157d0 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
157e0 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
157f0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
15800 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
15810 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
15820 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
15830 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
15840 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
15850 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
15860 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
15870 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
15880 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
15890 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45  arse->nMem += nE
158a0 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  xpr+1;.    sqlit
158b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
158d0 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
158e0 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65  yDup = sqlite3Ke
158f0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
15900 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  Expr, 1);.    if
15910 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
15920 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15930 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
15940 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b  able(pKeyDup) );
15950 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15960 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
15970 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
15980 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
15990 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
159a0 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
159b0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
159c0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
159d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
159e0 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
159f0 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
15a00 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
15a10 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
15a20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
15a30 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
15a40 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
15a50 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
15a60 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
15a70 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
15a80 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
15a90 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
15aa0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
15ab0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15ac0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
15ad0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
15ae0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
15af0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
15b00 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
15b10 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
15b20 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
15b30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
15b40 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
15b50 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
15b60 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
15b70 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
15b80 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
15b90 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
15ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15bb0 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
15bc0 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
15bd0 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15c00 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
15c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15c20 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
15c30 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
15c40 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
15c50 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
15c60 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
15c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
15c80 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
15c90 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
15ca0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
15cb0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
15cc0 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
15cd0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
15ce0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
15cf0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
15d00 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofA = ++pParse->
15d10 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
15d20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15d30 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b  m;.  regEofB = +
15d40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15d50 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
15d60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
15d70 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
15d80 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
15d90 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
15da0 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
15db0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
15dc0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
15dd0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
15de0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
15df0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
15e00 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76   Jump past the v
15e10 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e  arious subroutin
15e20 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65  es and coroutine
15e30 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  s to the main.  
15e40 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  ** merge loop.  
15e50 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  */.  j1 = sqlite
15e60 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
15e70 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53  P_Goto);.  addrS
15e80 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
15e90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15ea0 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  v);...  /* Gener
15eb0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
15ec0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
15ed0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15ee0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
15ef0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
15f00 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
15f10 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
15f20 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15f30 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
15f40 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
15f50 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
15f60 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
15f70 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
15f80 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
15f90 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
15fa0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
15fb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15fc0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
15fd0 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
15fe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ff0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
16000 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
16010 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16020 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
16030 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
16040 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f  ment((v, "End co
16050 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
16060 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
16070 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
16080 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
16090 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
160a0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
160b0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
160c0 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
160d0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
160e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
160f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64  entAddr(v);.  Vd
16100 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
16110 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
16120 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
16130 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
16140 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
16150 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
16160 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
16170 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
16180 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
16190 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
161a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
161b0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
161c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
161d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
161e0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
161f0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
16200 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
16210 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
16220 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
16230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16240 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
16250 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
16260 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16270 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
16280 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  B);.  VdbeNoopCo
16290 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
162a0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
162b0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ht SELECT"));.. 
162c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
162d0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
162e0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
162f0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
16300 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
16310 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
16320 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
16330 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
16340 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
16350 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
16360 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
16370 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
16380 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
16390 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
163b0 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
163c0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
163d0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
163e0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
163f0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
16400 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
16410 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
16420 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
16430 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
16440 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
16450 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
16460 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
16470 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
16480 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
16490 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
164a0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
164b0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
164c0 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
164d0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
164e0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
164f0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
16500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16510 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
16520 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16540 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
16550 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
16560 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
16570 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
16580 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
16590 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
165a0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
165b0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
165c0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
165d0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
165e0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
165f0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
16600 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16610 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
16620 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
16630 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
16640 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
16650 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
16660 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16670 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16680 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
16690 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
166a0 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
166b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
166c0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
166d0 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
166e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
166f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
16700 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
16710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16720 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16730 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
16740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16750 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16760 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
16770 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
16780 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
16790 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
167a0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
167b0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
167c0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
167d0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
167e0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
167f0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
16800 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
16810 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
16820 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
16830 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
16840 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
16850 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
16860 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
16870 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
16880 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
16890 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
168a0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
168b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
168c0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
168d0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
168e0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
168f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
16900 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
16910 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
16920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16930 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
16940 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
16950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16960 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16970 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
16980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16990 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
169a0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
169b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
169c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
169d0 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
169e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
169f0 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
16a00 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
16a10 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
16a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16a30 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
16a40 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
16a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16a60 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16a70 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
16a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16a90 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
16aa0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
16ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16ac0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
16ad0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
16ae0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16af0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
16b00 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
16b10 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
16b20 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
16b30 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
16b40 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
16b50 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
16b60 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
16b70 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
16b80 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
16b90 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16ba0 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
16bb0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
16bc0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
16bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16be0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16bf0 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
16c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c10 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
16c20 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
16c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16c50 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
16c60 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
16c70 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
16c80 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
16c90 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16ca0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
16cb0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
16cc0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
16cd0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16ce0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
16cf0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
16d00 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
16d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16d30 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
16d40 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
16d50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
16d70 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
16d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16d90 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
16da0 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
16db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16dc0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
16dd0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
16de0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
16df0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
16e00 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
16e10 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16e20 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
16e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16e40 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16e50 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
16e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16e70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16e80 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
16e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16ea0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
16eb0 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
16ec0 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
16ed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16ee0 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
16ef0 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
16f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f10 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16f20 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
16f30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16f40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
16f50 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
16f60 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
16f70 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
16f80 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
16f90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16fa0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
16fb0 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
16fc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
16fd0 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
16fe0 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
16ff0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
17000 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
17010 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
17020 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
17030 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
17040 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
17070 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
17080 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17090 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
170a0 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
170b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
170c0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
170d0 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
170e0 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f   addrAgtB);..  /
170f0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
17100 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
17110 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
17120 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
17130 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17140 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
17150 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
17160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
17170 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
17180 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
17190 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
171a0 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
171b0 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
171c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
171d0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
171e0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
171f0 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
17200 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
17210 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
17220 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
17230 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
17240 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
17250 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
17260 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
17270 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
17280 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
17290 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
172a0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
172b0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
172c0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
172d0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
172e0 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a   = pPrior;..  /*
172f0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
17300 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
17310 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
17320 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
17330 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
17340 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
17350 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
17360 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
17370 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
17380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17390 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
173a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
173b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
173c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
173d0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
173e0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
173f0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
17400 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
17410 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
17420 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
17430 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
17440 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
17450 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
17460 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
17470 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
17480 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
17490 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
174a0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
174b0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
174c0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
174d0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
174e0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
174f0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
17500 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
17510 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
17520 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
17530 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
17540 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
17550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
17560 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
17570 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
17580 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
17590 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
175a0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
175b0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
175c0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
175d0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
175e0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
175f0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
17600 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
17610 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
17620 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
17630 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
17640 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
17650 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
17660 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
17670 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
17680 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
17690 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
176a0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
176b0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
176c0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
176d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
176e0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
176f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
17700 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
17710 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
17720 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
17730 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
17740 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
17750 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
17760 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
17770 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
17780 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17790 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
177a0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
177b0 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
177c0 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
177d0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
177e0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
177f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
17800 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
17810 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
17820 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
17830 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
17840 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
17850 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
17860 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
17870 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
17880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17890 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
178a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
178b0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
178c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
178d0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
178e0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
178f0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
17900 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
17910 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
17920 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
17930 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
17940 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17950 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
17960 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
17970 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
17980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
17990 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
179a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
179b0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
179c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
179d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
179e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
179f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17a00 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
17a10 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17a20 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17a30 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
17a40 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
17a50 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
17a60 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  EList);.    }els
17a70 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
17a80 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72  prList(db, pExpr
17a90 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c  ->x.pList, iTabl
17aa0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
17ab0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
17ac0 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
17ad0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
17ae0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
17af0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
17b00 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
17b10 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
17b20 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
17b30 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
17b40 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
17b50 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
17b60 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
17b70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
17b80 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
17b90 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
17ba0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
17bb0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
17bc0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
17bd0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
17be0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17bf0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
17c00 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
17c10 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
17c20 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
17c30 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
17c40 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
17c50 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73  pEList);.  }.}.s
17c60 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
17c70 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Select(.  sqlite
17c80 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
17c90 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
17ca0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
17cb0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
17cc0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
17cd0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
17ce0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
17cf0 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
17d00 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
17d10 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
17d20 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20  e replaced */.  
17d30 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
17d40 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
17d50 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
17d60 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
17d70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17d80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17d90 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
17da0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
17db0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
17dc0 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
17dd0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
17de0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
17df0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
17e00 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
17e10 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
17e20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
17e30 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17e40 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
17e50 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
17e60 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
17e70 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57  pEList);.  p->pW
17e80 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
17e90 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
17ea0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17eb0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
17ec0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
17ed0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17ee0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
17ef0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
17f00 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20  );  /* Even for 
17f10 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61  (SELECT 1) we ha
17f20 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20  ve: pSrc!=0 but 
17f30 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f  pSrc->nSrc==0 */
17f40 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
17f50 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rc) ){.    for(i
17f60 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
17f70 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
17f80 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
17f90 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
17fa0 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
17fb0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
17fc0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
17fd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
17fe0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17ff0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
18000 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18010 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
18020 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
18030 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
18040 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
18050 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
18060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18070 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
18080 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
18090 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
180a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
180b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
180c0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
180d0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
180e0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
180f0 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
18100 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
18110 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
18120 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
18130 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
18140 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
18150 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
18160 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
18170 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
18180 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
18190 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
181a0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
181b0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
181c0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
181d0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
181e0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
181f0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
18200 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
18210 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
18220 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
18230 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
18240 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
18250 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
18260 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
18270 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
18280 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
18290 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
182a0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
182b0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
182c0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
182d0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
182e0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
182f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18300 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
18310 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
18320 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
18330 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
18340 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
18350 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
18360 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
18370 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
18380 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
18390 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
183a0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
183b0 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
183c0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
183d0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
183e0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
183f0 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
18400 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
18410 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
18420 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
18430 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
18440 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
18450 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
18460 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
18470 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
18480 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
18490 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
184a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
184b0 20 28 30 29 20 20 54 68 65 20 73 75 62 71 75 65   (0)  The subque
184c0 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
184d0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
184e0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
184f0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
18500 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
18510 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
18520 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
18530 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
18540 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
18550 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
18560 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
18570 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
18580 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
18590 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
185a0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
185b0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
185c0 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
185d0 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
185e0 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
185f0 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
18600 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
18610 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
18620 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
18630 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
18640 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
18650 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
18660 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
18670 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
18680 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
18690 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
186a0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
186b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
186c0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
186d0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
186e0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
186f0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
18700 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
18710 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
18720 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
18730 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
18740 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
18750 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
18760 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
18770 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
18780 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
18790 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
187a0 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
187b0 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
187c0 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
187d0 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
187e0 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
187f0 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
18800 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
18810 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
18820 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
18830 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
18840 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
18850 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
18860 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
18870 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
18880 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
18890 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
188a0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
188b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
188c0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
188d0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
188e0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
188f0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
18900 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
18910 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
18920 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
18930 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
18940 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
18950 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
18960 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
18970 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
18980 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
18990 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
189a0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
189b0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
189c0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
189d0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
189e0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
189f0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
18a00 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
18a10 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
18a20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
18a30 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
18a40 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
18a50 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
18a60 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
18a70 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
18a80 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
18a90 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
18aa0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
18ab0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
18ac0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
18ad0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
18ae0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
18af0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
18b00 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
18b10 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
18b20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
18b30 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
18b40 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
18b50 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
18b60 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
18b70 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
18b80 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
18b90 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
18ba0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
18bb0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
18bc0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
18bd0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
18be0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
18bf0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
18c00 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
18c10 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
18c20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
18c30 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
18c40 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
18c50 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
18c60 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
18c70 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
18c80 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
18c90 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
18ca0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
18cb0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
18cc0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
18cd0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
18ce0 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
18cf0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
18d00 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
18d10 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18d20 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
18d30 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
18d40 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
18d50 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
18d60 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
18d70 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
18d80 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
18d90 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
18da0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
18db0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
18dc0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
18dd0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
18de0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
18df0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
18e00 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
18e10 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
18e20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
18e30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
18e40 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
18e50 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
18e60 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
18e70 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
18e80 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
18e90 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
18ea0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
18eb0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
18ec0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
18ed0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
18ee0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
18ef0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
18f00 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
18f10 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
18f20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
18f30 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
18f40 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
18f50 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
18f60 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
18f70 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
18f80 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
18f90 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
18fa0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
18fb0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
18fc0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
18fd0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
18fe0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
18ff0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
19000 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
19010 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
19020 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
19030 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
19040 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
19050 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
19060 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
19070 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
19080 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
19090 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
190a0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
190b0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
190c0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
190d0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
190e0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
190f0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
19100 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
19110 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
19120 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
19130 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
19140 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
19150 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
19160 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
19170 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
19180 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
19190 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
191a0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
191b0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
191c0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
191d0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
191e0 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
191f0 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
19200 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
19210 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
19220 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
19230 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
19240 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
19250 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
19260 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
19270 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
19280 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
19290 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
192a0 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
192b0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
192c0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
192d0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
192e0 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
192f0 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
19300 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
19310 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
19320 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
19330 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
19340 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
19350 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
19360 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ])..**.** In thi
19370 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
19380 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
19390 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
193a0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
193b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
193c0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
193d0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
193e0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
193f0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
19400 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
19410 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
19420 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
19430 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
19440 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
19450 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
19460 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
19470 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
19480 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
19490 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
194a0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
194b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
194c0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
194d0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
194e0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
194f0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
19500 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
19510 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
19520 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
19530 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
19540 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
19550 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
19560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19570 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19580 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
19590 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
195a0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
195b0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
195c0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
195d0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
195e0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
195f0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
19600 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
19610 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
19620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19630 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
19640 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
19650 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
19660 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
19670 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
19680 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
19690 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
196a0 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
196b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
196c0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
196d0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
196e0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
196f0 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
19700 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
19710 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
19720 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
19730 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
19740 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
19750 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
19760 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
19770 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
19780 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
19790 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
197a0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
197b0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
197c0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
197d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
197e0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
197f0 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
19800 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
19810 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
19820 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19830 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
19840 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
19850 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
19860 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
19870 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
19880 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
19890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
198a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
198b0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
198e0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
198f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19900 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
19910 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
19920 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19930 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
19940 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19950 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
19960 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
19970 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
19980 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
19990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
199a0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
199b0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
199c0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
199d0 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
199e0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
199f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
19a00 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
19a10 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
19a20 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
19a30 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
19a40 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
19a50 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
19a60 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
19a70 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
19a80 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
19a90 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
19aa0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
19ab0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
19ac0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
19ad0 70 53 75 62 2d 3e 70 52 65 63 75 72 73 65 20 29  pSub->pRecurse )
19ae0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19b10 6e 20 28 30 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (0)  */.  if( 
19b20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
19b30 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
19b40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19b50 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19b60 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
19b70 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
19b80 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
19b90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19ba0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19bb0 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
19bc0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
19bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
19be0 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
19bf0 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
19c00 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
19c10 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
19c20 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
19c30 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
19c40 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
19c50 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
19c60 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
19c70 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
19c80 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
19c90 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
19ca0 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
19cb0 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
19cc0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
19cd0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
19ce0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
19cf0 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
19d00 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
19d10 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
19d20 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
19d30 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
19d40 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
19d50 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
19d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19d70 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
19d80 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
19d90 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
19da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19dc0 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
19dd0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
19de0 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
19df0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
19e00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19e40 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
19e50 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
19e60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19e90 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
19ea0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
19eb0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
19ec0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19ed0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19ee0 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
19ef0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
19f00 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
19f10 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
19f20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
19f30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19f40 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
19f50 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
19f60 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
19f70 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
19f80 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
19f90 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
19fa0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19fb0 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
19fc0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
19fd0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
19fe0 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
19ff0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a020 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1a030 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1a040 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1a050 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1a060 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a070 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1a080 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1a090 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1a0a0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1a0b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1a0c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1a0d0 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1a0e0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1a0f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1a100 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1a110 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1a120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a130 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1a140 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54   }..  /* OBSOLET
1a150 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1a160 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1a170 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1a180 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1a190 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1a1a0 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1a1b0 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1a1c0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1a1d0 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1a1e0 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1a1f0 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1a200 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1a210 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1a220 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1a230 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1a240 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1a250 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1a260 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1a270 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1a280 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1a290 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1a2a0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1a2b0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1a2c0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1a2d0 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1a2e0 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1a2f0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1a300 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1a310 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1a320 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1a330 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1a340 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1a350 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1a360 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1a370 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1a380 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1a390 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1a3a0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1a3b0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1a3c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1a3d0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1a3e0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1a3f0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1a400 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1a410 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1a420 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1a430 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1a440 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1a450 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1a460 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1a470 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1a480 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1a490 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1a4a0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1a4b0 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1a4c0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1a4d0 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1a4e0 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1a4f0 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1a500 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1a510 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1a520 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1a530 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1a540 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1a550 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1a560 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1a570 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1a580 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1a590 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1a5a0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1a5b0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1a5c0 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1a5d0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1a5e0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1a5f0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1a600 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a610 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1a620 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1a630 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1a640 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1a650 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1a660 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1a670 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1a680 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1a690 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1a6a0 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1a6b0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1a6c0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1a6d0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1a6e0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1a6f0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1a700 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1a710 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1a720 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1a730 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1a740 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1a750 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1a760 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1a770 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1a780 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1a790 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1a7a0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1a7b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a7c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1a7d0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1a7e0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1a7f0 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1a800 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1a810 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1a820 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1a830 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1a840 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a850 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1a860 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1a870 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1a880 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1a890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a8a0 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1a8b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1a8c0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1a8d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1a8e0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1a8f0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1a900 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1a910 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1a920 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1a930 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1a940 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1a950 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1a960 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1a970 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1a980 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1a990 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1a9a0 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1a9b0 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1a9c0 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1a9d0 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1a9e0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1a9f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1aa00 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1aa10 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1aa20 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1aa30 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1aa40 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1aa50 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1aa60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1aa70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1aa80 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1aa90 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1aaa0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1aab0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1aac0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1aad0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1aae0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1aaf0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1ab00 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1ab10 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1ab20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1ab30 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1ab40 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1ab50 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1ab60 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1ab70 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1ab80 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1ab90 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1aba0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1abb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1abc0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1abd0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1abe0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1abf0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1ac00 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1ac10 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1ac20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1ac30 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1ac40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1ac50 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1ac60 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1ac70 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1ac80 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1ac90 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1aca0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1acb0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1acc0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1acd0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1ace0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1acf0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1ad00 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1ad10 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1ad20 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1ad30 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1ad40 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1ad50 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1ad60 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1ad70 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1ad80 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1ad90 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1ada0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1adb0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1adc0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1add0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1ade0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1adf0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ae00 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1ae10 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1ae20 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1ae30 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1ae40 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1ae50 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1ae60 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1ae70 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1ae80 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1ae90 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1aea0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1aeb0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1aec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1aed0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1aee0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1aef0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1af00 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1af10 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1af20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1af30 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1af40 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1af50 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1af60 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1af70 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1af80 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1af90 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1afa0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1afb0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1afc0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1afd0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1afe0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1aff0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1b000 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1b010 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1b020 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1b030 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1b040 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1b050 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1b060 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1b070 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1b080 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1b090 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1b0a0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1b0b0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1b0c0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1b0d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1b0e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1b0f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1b100 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1b110 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1b120 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1b130 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1b140 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1b150 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1b160 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1b170 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1b180 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1b190 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1b1a0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1b1b0 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
1b1c0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e   = 0;.    if( pN
1b1d0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1b1e0 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  New = pPrior;.  
1b1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b200 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
1b210 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  rior;.      pNew
1b220 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
1b230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
1b240 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
1b250 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b260 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1b270 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
1b280 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
1b290 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
1b2a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b2b0 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
1b2c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1b2d0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
1b2e0 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
1b2f0 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
1b300 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
1b310 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1b320 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1b330 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1b340 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1b350 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1b360 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1b370 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1b380 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1b390 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
1b3a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1b3b0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
1b3c0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
1b3d0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
1b3e0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1b3f0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
1b400 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
1b410 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
1b420 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
1b430 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
1b440 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
1b450 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1b460 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
1b470 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1b480 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
1b490 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
1b4a0 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
1b4b0 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
1b4c0 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
1b4d0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1b4e0 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
1b4f0 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
1b500 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
1b510 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1b520 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
1b530 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
1b540 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
1b550 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
1b560 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
1b570 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
1b580 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1b590 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
1b5a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
1b5b0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
1b5c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
1b5d0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1b5e0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1b5f0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1b600 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
1b610 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
1b620 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1b630 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
1b640 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
1b650 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
1b660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
1b670 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
1b680 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
1b690 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
1b6a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1b6b0 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
1b6c0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
1b6d0 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
1b6e0 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
1b6f0 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
1b700 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
1b710 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1b720 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
1b730 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
1b740 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
1b750 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1b760 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1b770 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
1b780 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
1b790 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1b7a0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
1b7b0 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
1b7c0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1b7d0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1b7e0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1b7f0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1b800 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1b810 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
1b820 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
1b830 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
1b840 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1b850 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
1b860 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
1b870 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
1b880 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
1b890 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
1b8a0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
1b8b0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
1b8c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
1b8d0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
1b8e0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
1b8f0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
1b900 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
1b910 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1b920 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1b930 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1b940 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1b950 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
1b960 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
1b970 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
1b980 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
1b990 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
1b9a0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
1b9b0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1b9c0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
1b9d0 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
1b9e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
1b9f0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1ba00 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1ba10 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
1ba20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
1ba30 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
1ba40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1ba50 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
1ba60 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1ba70 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1ba80 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
1ba90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1baa0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1bab0 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
1bac0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bad0 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
1bae0 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
1baf0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1bb00 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
1bb10 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
1bb20 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1bb30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bb40 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1bb50 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1bb60 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1bb70 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1bb80 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1bb90 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1bba0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1bbb0 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1bbc0 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1bbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1bbe0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1bbf0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1bc00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1bc10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1bc20 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1bc30 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1bc40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bc50 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1bc60 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1bc70 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1bc80 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1bc90 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1bca0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1bcb0 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1bcc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1bcd0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1bce0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1bcf0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1bd00 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1bd10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1bd20 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1bd30 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1bd40 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1bd50 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1bd60 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1bd70 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1bd80 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1bd90 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1bda0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1bdb0 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1bdc0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1bdd0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1bde0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1bdf0 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1be00 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1be10 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1be20 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1be30 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1be40 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1be50 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1be60 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1be70 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1be80 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1be90 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1bea0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1beb0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1bec0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1bed0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1bee0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1bef0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1bf00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1bf10 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1bf20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1bf30 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1bf40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bf50 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1bf60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bf70 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1bf80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bf90 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1bfa0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1bfb0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1bfc0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1bfd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1bfe0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1bff0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1c000 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1c010 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1c020 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1c030 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1c040 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1c050 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1c060 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1c070 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1c080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1c090 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
1c0a0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
1c0b0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
1c0c0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
1c0d0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
1c0e0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
1c0f0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
1c100 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
1c110 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
1c120 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1c130 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
1c140 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1c150 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
1c160 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
1c170 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
1c180 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
1c190 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
1c1a0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1c1b0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1c1c0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1c1d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
1c1e0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
1c1f0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1c200 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1c210 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1c220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c230 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
1c240 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
1c250 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1c260 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c270 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1c280 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
1c290 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
1c2a0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
1c2b0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
1c2c0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1c2d0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
1c2e0 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
1c2f0 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
1c300 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1c310 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c320 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1c330 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
1c340 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1c350 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
1c360 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
1c370 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1c380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1c390 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
1c3a0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1c3b0 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1c3c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c3d0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c3e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
1c3f0 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
1c400 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1c410 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
1c420 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c430 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1c440 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
1c450 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1c460 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1c470 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1c480 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1c490 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1c4a0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c4b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c4c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1c4d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c4e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1c4f0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1c500 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1c510 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1c520 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1c530 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1c540 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1c550 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1c560 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1c570 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1c580 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1c590 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c5a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c5b0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1c5c0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1c5d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1c5e0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1c5f0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c600 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1c610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c620 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1c630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c640 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1c650 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1c660 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1c670 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1c680 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c690 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1c6a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1c6b0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1c6c0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1c6d0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1c6e0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1c6f0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1c700 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1c710 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1c720 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1c760 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1c770 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1c780 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1c790 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1c7a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1c7b0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1c7c0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1c7d0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1c7e0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1c7f0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1c800 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1c810 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1c820 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1c830 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1c840 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1c850 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1c860 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1c870 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1c880 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1c890 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1c8a0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1c8b0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1c8c0 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1c8d0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1c8e0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1c8f0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1c900 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1c910 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1c920 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1c930 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1c940 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1c950 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1c960 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1c970 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1c980 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1c990 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1c9a0 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1c9b0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1c9c0 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
1c9d0 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
1c9e0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
1c9f0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
1ca00 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
1ca10 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ca20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1ca30 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
1ca40 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
1ca50 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
1ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ca70 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1ca80 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1ca90 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1caa0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1cab0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1cac0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1cad0 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
1cae0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1caf0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1cb00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1cb10 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1cb20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1cb30 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
1cb40 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1cb50 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
1cb60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
1cb70 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1cb80 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
1cb90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1cba0 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
1cbb0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1cbc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
1cbd0 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
1cbe0 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
1cbf0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1cc00 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
1cc10 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1cc20 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
1cc30 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
1cc40 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
1cc50 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
1cc60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1cc70 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
1cc80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
1cc90 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
1cca0 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
1ccb0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1ccc0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1ccd0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1cce0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
1ccf0 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
1cd00 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1cd10 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
1cd20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1cd30 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
1cd40 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
1cd50 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
1cd60 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
1cd70 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
1cd80 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
1cd90 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
1cda0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
1cdb0 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
1cdc0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
1cdd0 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
1cde0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
1cdf0 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
1ce00 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
1ce10 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1ce20 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
1ce30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1ce40 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
1ce50 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
1ce60 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
1ce70 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
1ce80 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
1ce90 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
1cea0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
1ceb0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
1cec0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1ced0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
1cee0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1cef0 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
1cf00 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
1cf10 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1cf20 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
1cf30 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
1cf40 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
1cf50 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
1cf60 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
1cf70 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1cf80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1cf90 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
1cfa0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1cfb0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1cfc0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
1cfd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1cfe0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1cff0 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
1d000 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1d010 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
1d020 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1d030 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
1d040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1d050 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1d060 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
1d070 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1d080 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1d090 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1d0a0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
1d0b0 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
1d0c0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
1d0d0 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
1d0e0 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
1d0f0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1d100 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1d110 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
1d120 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
1d130 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
1d140 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
1d150 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
1d160 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
1d170 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
1d180 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
1d190 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
1d1a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1d1b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
1d1c0 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
1d1d0 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
1d1e0 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
1d1f0 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
1d200 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
1d210 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
1d220 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
1d230 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
1d240 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1d250 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
1d260 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
1d270 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1d280 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
1d290 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
1d2a0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
1d2b0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
1d2c0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
1d2d0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
1d2e0 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
1d2f0 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
1d300 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
1d310 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
1d320 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
1d330 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
1d340 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
1d350 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
1d360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1d370 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
1d380 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
1d390 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
1d3a0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1d3b0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
1d3c0 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
1d3d0 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
1d3e0 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
1d3f0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
1d400 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1d410 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1d420 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
1d430 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
1d440 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
1d450 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1d460 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1d470 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
1d480 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
1d490 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
1d4a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1d4b0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
1d4c0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1d4d0 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
1d4e0 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
1d4f0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1d500 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
1d510 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
1d520 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
1d530 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
1d540 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
1d550 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
1d560 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
1d570 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
1d580 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
1d590 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
1d5a0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
1d5b0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
1d5c0 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
1d5d0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
1d5e0 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
1d5f0 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
1d600 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
1d610 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1d620 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
1d630 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1d640 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
1d650 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
1d660 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
1d670 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1d680 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
1d690 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
1d6a0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1d6b0 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
1d6c0 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
1d6d0 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
1d6e0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1d6f0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1d700 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
1d710 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1d720 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
1d730 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
1d740 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1d750 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
1d760 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
1d770 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d780 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1d790 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
1d7a0 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
1d7b0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1d7c0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
1d7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1d7e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
1d7f0 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
1d800 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
1d810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
1d820 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
1d830 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1d840 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
1d850 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d860 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
1d870 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
1d880 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
1d890 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
1d8a0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
1d8b0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1d8c0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
1d8d0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
1d8e0 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
1d8f0 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
1d900 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
1d910 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
1d920 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
1d930 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
1d940 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
1d950 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
1d960 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
1d970 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1d980 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
1d990 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
1d9a0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1d9b0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
1d9c0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
1d9d0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
1d9e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1d9f0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
1da00 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
1da10 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
1da20 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
1da30 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
1da40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
1da50 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
1da60 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
1da70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1da80 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
1da90 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1daa0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
1dab0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
1dac0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1dad0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
1dae0 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
1daf0 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
1db00 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
1db10 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
1db20 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
1db30 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1db40 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
1db50 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
1db60 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
1db70 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
1db80 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
1db90 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
1dba0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
1dbb0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1dbc0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1dbd0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1dbe0 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
1dbf0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
1dc00 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1dc10 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
1dc20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
1dc30 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
1dc40 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
1dc50 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
1dc60 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1dc70 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
1dc80 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
1dc90 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1dca0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
1dcb0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
1dcc0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
1dcd0 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
1dce0 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
1dcf0 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
1dd00 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1dd10 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
1dd20 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
1dd30 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
1dd40 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1dd50 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
1dd60 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1dd70 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
1dd80 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
1dd90 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1dda0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
1ddb0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1ddc0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
1ddd0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1dde0 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
1ddf0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1de00 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
1de10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1de20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1de30 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1de40 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
1de50 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1de60 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1de70 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
1de80 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
1de90 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
1dea0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1deb0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1dec0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
1ded0 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
1dee0 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
1def0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1df00 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
1df10 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
1df20 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
1df30 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
1df40 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1df50 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
1df60 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  r(db, TK_ALL, 0)
1df70 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
1df80 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
1df90 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
1dfa0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
1dfb0 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
1dfc0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
1dfd0 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
1dfe0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  Prior = 0;.  pNe
1dff0 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
1e000 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
1e010 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
1e020 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69  _Continue;.}..#i
1e030 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e040 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75  T_CTE./*.** Argu
1e050 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63  ment pWith (whic
1e060 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70  h may be NULL) p
1e070 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65  oints to a linke
1e080 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64  d list of nested
1e090 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78   .** WITH contex
1e0a0 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74  ts, from inner t
1e0b0 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20  o outermost. If 
1e0c0 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
1e0d0 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d  fied by .** FROM
1e0e0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
1e0f0 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20  pItem is really 
1e100 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65  a common-table-e
1e110 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20  xpression (CTE) 
1e120 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
1e130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e140 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20   CTE definition 
1e150 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20  for that table. 
1e160 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74  Otherwise.** ret
1e170 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
1e180 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
1e190 73 65 61 72 63 68 57 69 74 68 28 57 69 74 68 20  searchWith(With 
1e1a0 2a 70 57 69 74 68 2c 20 73 74 72 75 63 74 20 53  *pWith, struct S
1e1b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1e1c0 65 6d 29 7b 0a 20 20 69 66 28 20 70 49 74 65 6d  em){.  if( pItem
1e1d0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29  ->zDatabase==0 )
1e1e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1e1f0 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   *zName = pItem-
1e200 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 57 69 74 68  >zName;.    With
1e210 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1e220 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
1e230 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
1e240 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
1e250 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
1e260 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1e270 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1e280 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
1e290 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
1e2a0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
1e2b0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
1e2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e2d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1e2e0 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
1e2f0 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
1e300 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
1e310 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
1e320 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
1e330 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
1e340 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
1e350 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
1e360 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1e370 75 74 69 6e 65 73 20 70 75 73 68 20 61 6e 64 20  utines push and 
1e380 70 75 6c 6c 20 57 49 54 48 20 63 6c 61 75 73 65  pull WITH clause
1e390 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
1e3a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
1e3b0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
1e3c0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
1e3d0 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
1e3e0 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   ){.    pWith->p
1e3f0 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
1e400 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
1e410 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
1e420 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1e430 66 20 61 72 67 75 6d 65 6e 74 20 70 43 74 65 20  f argument pCte 
1e440 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 63 68 65  is not NULL, che
1e450 63 6b 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ck if it is alre
1e460 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
1e470 65 0a 2a 2a 20 73 74 61 63 6b 20 6f 66 20 43 54  e.** stack of CT
1e480 45 73 20 73 74 6f 72 65 64 20 62 79 20 74 68 65  Es stored by the
1e490 20 70 61 72 73 65 72 2e 20 49 66 20 73 6f 2c 20   parser. If so, 
1e4a0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
1e4b0 6e 20 69 6c 6c 65 67 61 6c 0a 2a 2a 20 72 65 63  n illegal.** rec
1e4c0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
1e4d0 20 69 6e 20 61 20 43 54 45 2c 20 73 65 74 20 6f   in a CTE, set o
1e4e0 66 20 6d 75 74 75 61 6c 6c 79 20 72 65 63 75 72  f mutually recur
1e4f0 73 69 76 65 20 43 54 45 73 2e 20 53 74 6f 72 65  sive CTEs. Store
1e500 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  .** an error in 
1e510 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 72  the parser and r
1e520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1e530 4f 52 20 69 66 20 74 68 69 73 20 69 73 20 74 68  OR if this is th
1e540 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  e case..**.** Ot
1e550 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 74 65  herwise, if pCte
1e560 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1e570 70 61 72 74 20 6f 66 20 74 68 65 20 73 74 61 63  part of the stac
1e580 6b 20 6f 66 20 43 54 45 73 20 73 74 6f 72 65 64  k of CTEs stored
1e590 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 72 73 65  .** in the parse
1e5a0 72 2c 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  r, push it onto 
1e5b0 74 68 65 20 73 74 6f 70 20 6f 66 20 74 68 61 74  the stop of that
1e5c0 20 73 74 61 63 6b 2e 0a 2a 2f 20 0a 73 74 61 74   stack..*/ .stat
1e5d0 69 63 20 69 6e 74 20 63 74 65 50 75 73 68 28 50  ic int ctePush(P
1e5e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
1e5f0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 29 7b  ruct Cte *pCte){
1e600 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
1e610 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70     struct Cte *p
1e620 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 72  ;.    for(p=pPar
1e630 73 65 2d 3e 70 43 74 65 3b 20 70 3b 20 70 3d 70  se->pCte; p; p=p
1e640 2d 3e 70 4f 75 74 65 72 43 74 65 29 7b 0a 20 20  ->pOuterCte){.  
1e650 20 20 20 20 69 66 28 20 70 3d 3d 70 43 74 65 20      if( p==pCte 
1e660 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e670 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
1e680 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1e690 22 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69  "illegal recursi
1e6a0 76 65 20 64 65 66 69 6e 69 6e 69 74 69 6f 6e 20  ve defininition 
1e6b0 69 6e 20 63 74 65 3a 20 25 73 22 2c 20 70 43 74  in cte: %s", pCt
1e6c0 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  e->zName.       
1e6d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1e6e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1e6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e700 20 20 20 0a 20 20 20 20 70 43 74 65 2d 3e 70 4f     .    pCte->pO
1e710 75 74 65 72 43 74 65 20 3d 20 70 50 61 72 73 65  uterCte = pParse
1e720 2d 3e 70 43 74 65 3b 0a 20 20 20 20 70 50 61 72  ->pCte;.    pPar
1e730 73 65 2d 3e 70 43 74 65 20 3d 20 70 43 74 65 3b  se->pCte = pCte;
1e740 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1e750 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
1e760 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 43 74   If argument pCt
1e770 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
1e780 74 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  t must be a poin
1e790 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 63  ter to the CTE c
1e7a0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 20 74  urrently.** on t
1e7b0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
1e7c0 6f 66 20 43 54 45 73 20 73 74 6f 72 65 64 20 69  of CTEs stored i
1e7d0 6e 20 74 68 65 20 70 61 72 73 65 72 2e 20 52 65  n the parser. Re
1e7e0 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 61  move it from tha
1e7f0 74 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73  t.** stack..*/.s
1e800 74 61 74 69 63 20 76 6f 69 64 20 63 74 65 50 6f  tatic void ctePo
1e810 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1e820 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
1e830 65 29 7b 0a 20 20 69 66 28 20 70 43 74 65 20 29  e){.  if( pCte )
1e840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e850 61 72 73 65 2d 3e 70 43 74 65 3d 3d 70 43 74 65  arse->pCte==pCte
1e860 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1e870 70 43 74 65 20 3d 20 70 43 74 65 2d 3e 70 4f 75  pCte = pCte->pOu
1e880 74 65 72 43 74 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  terCte;.  }.}../
1e890 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e8a0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
1e8b0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
1e8c0 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
1e8d0 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
1e8e0 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
1e8f0 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
1e900 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
1e910 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
1e920 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
1e930 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
1e940 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
1e950 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
1e960 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
1e970 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
1e980 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
1e990 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
1e9a0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
1e9b0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
1e9c0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
1e9d0 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
1e9e0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
1e9f0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
1ea00 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
1ea10 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
1ea20 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
1ea30 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
1ea40 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
1ea50 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
1ea60 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
1ea70 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
1ea80 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
1ea90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1eaa0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
1eab0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
1eac0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
1ead0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1eae0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
1eaf0 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
1eb00 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
1eb10 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1eb20 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1eb30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1eb40 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
1eb50 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
1eb60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1eb70 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
1eb80 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 50  Table *pTab;.  P
1eb90 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1eba0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1ebb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ebc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
1ebd0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 0a  ruct Cte *pCte;.
1ebe0 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
1ebf0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
1ec00 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
1ec10 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
1ec20 20 70 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 70   pFrom);.  if( p
1ec30 43 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Cte==0 ){.    /*
1ec40 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73   no-op */.  }els
1ec50 65 20 69 66 28 20 70 43 74 65 3d 3d 70 50 61 72  e if( pCte==pPar
1ec60 73 65 2d 3e 70 43 74 65 20 26 26 20 28 70 54 61  se->pCte && (pTa
1ec70 62 20 3d 20 70 43 74 65 2d 3e 70 54 61 62 29 20  b = pCte->pTab) 
1ec80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
1ec90 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
1eca0 70 61 72 74 20 6f 66 20 61 20 72 65 63 75 72 73  part of a recurs
1ecb0 69 76 65 20 43 54 45 20 2a 2f 0a 20 20 20 20 61  ive CTE */.    a
1ecc0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1ecd0 61 62 3d 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e  ab==0 && pFrom->
1ece0 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 26  isRecursive==0 &
1ecf0 26 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  & pFrom->pSelect
1ed00 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
1ed10 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
1ed20 20 20 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75     pFrom->isRecu
1ed30 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 70  rsive = 1;.    p
1ed40 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  Tab->nRef++;.  }
1ed50 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 4c 69  else{.    ExprLi
1ed60 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
1ed70 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
1ed80 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
1edb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1edc0 0a 20 20 20 20 69 6e 74 20 62 52 65 63 75 72 73  .    int bRecurs
1edd0 69 76 65 3b 0a 0a 20 20 20 20 70 46 72 6f 6d 2d  ive;..    pFrom-
1ede0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1edf0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1ee00 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
1ee10 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
1ee20 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1ee30 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
1ee40 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
1ee50 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
1ee60 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1ee70 64 62 2c 20 22 25 73 22 2c 20 70 43 74 65 2d 3e  db, "%s", pCte->
1ee80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
1ee90 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
1eea0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
1eeb0 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20 70  = 1048576;.    p
1eec0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
1eed0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20   TF_Ephemeral;. 
1eee0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
1eef0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
1ef00 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
1ef10 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
1ef20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1ef30 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
1ef40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ef50 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1ef60 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 69  Select );..    i
1ef70 66 28 20 63 74 65 50 75 73 68 28 70 50 61 72 73  f( ctePush(pPars
1ef80 65 2c 20 70 43 74 65 29 20 29 20 72 65 74 75 72  e, pCte) ) retur
1ef90 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1efa0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
1efb0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 52 65 63  Select;.    bRec
1efc0 75 72 73 69 76 65 20 3d 20 28 70 53 65 6c 2d 3e  ursive = (pSel->
1efd0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
1efe0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
1eff0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 63 75  );.    if( bRecu
1f000 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 61  rsive ){.      a
1f010 73 73 65 72 74 28 20 70 53 65 6c 2d 3e 70 50 72  ssert( pSel->pPr
1f020 69 6f 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ior );.      sql
1f030 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1f040 57 61 6c 6b 65 72 2c 20 70 53 65 6c 2d 3e 70 50  Walker, pSel->pP
1f050 72 69 6f 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rior);.    }else
1f060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
1f070 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1f080 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
1f090 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
1f0a0 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
1f0b0 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
1f0c0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
1f0d0 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
1f0e0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
1f0f0 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
1f100 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e     if( pEList->n
1f110 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c  Expr!=pCte->pCol
1f120 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  s->nExpr ){.    
1f130 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f140 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 74 65  Msg(pParse, "cte
1f150 20 5c 22 25 73 5c 22 20 72 65 74 75 72 6e 73 20   \"%s\" returns 
1f160 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
1f170 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
1f180 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
1f190 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
1f1a0 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
1f1b0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
1f1c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f1d0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1f1e0 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
1f1f0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
1f200 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74     }..    select
1f210 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1f220 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
1f230 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
1f240 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 0a   &pTab->aCol);..
1f250 20 20 20 20 69 66 28 20 62 52 65 63 75 72 73 69      if( bRecursi
1f260 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
1f270 6e 52 65 66 20 3d 20 70 54 61 62 2d 3e 6e 52 65  nRef = pTab->nRe
1f280 66 3b 0a 20 20 20 20 20 20 70 43 74 65 2d 3e 70  f;.      pCte->p
1f290 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
1f2a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1f2b0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
1f2c0 6c 29 3b 0a 20 20 20 20 20 20 70 43 74 65 2d 3e  l);.      pCte->
1f2d0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
1f2e0 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 20 3e  if( pTab->nRef >
1f2f0 20 6e 52 65 66 29 7b 0a 20 20 20 20 20 20 20 20   nRef){.        
1f300 70 53 65 6c 2d 3e 70 52 65 63 75 72 73 65 20 3d  pSel->pRecurse =
1f310 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61   pTab;.        a
1f320 73 73 65 72 74 28 20 70 54 61 62 2d 3e 74 6e 75  ssert( pTab->tnu
1f330 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  m==0 );.      }.
1f340 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 65 50 6f      }..    ctePo
1f350 70 28 70 50 61 72 73 65 2c 20 70 43 74 65 29 3b  p(pParse, pCte);
1f360 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1f370 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1f380 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1f390 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
1f3a0 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
1f3b0 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
1f3c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1f3d0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
1f3e0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
1f3f0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1f400 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
1f410 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
1f420 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1f430 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
1f440 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
1f450 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
1f460 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
1f470 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
1f480 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
1f490 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
1f4a0 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1f4b0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
1f4c0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
1f4d0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
1f4e0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
1f4f0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
1f500 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
1f510 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
1f520 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1f530 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1f540 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
1f550 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
1f560 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
1f570 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
1f580 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
1f590 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1f5a0 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
1f5b0 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
1f5c0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
1f5d0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1f5e0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
1f5f0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
1f600 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
1f610 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
1f620 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
1f630 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
1f640 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
1f650 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
1f660 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
1f670 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
1f680 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
1f690 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
1f6a0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1f6b0 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
1f6c0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
1f6d0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
1f6e0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
1f6f0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
1f700 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
1f710 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
1f720 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
1f730 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
1f740 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
1f750 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
1f760 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
1f770 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
1f780 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
1f790 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
1f7a0 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
1f7b0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1f7c0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
1f7d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1f7e0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
1f7f0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1f800 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1f810 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
1f820 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1f830 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
1f840 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1f850 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
1f860 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1f870 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1f880 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
1f890 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1f8a0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
1f8b0 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
1f8c0 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
1f8d0 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
1f8e0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
1f8f0 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
1f900 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f910 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1f920 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
1f930 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
1f940 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
1f950 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
1f960 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
1f970 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1f980 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
1f990 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
1f9a0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
1f9b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
1f9c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
1f9d0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
1f9e0 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
1f9f0 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
1fa00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
1fa10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1fa20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1fa30 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1fa40 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
1fa50 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
1fa60 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
1fa70 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1fa80 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1fa90 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
1faa0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
1fab0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
1fac0 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
1fad0 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
1fae0 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
1faf0 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
1fb00 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
1fb10 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
1fb20 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1fb30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
1fb40 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1fb50 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1fb60 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1fb70 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1fb80 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
1fb90 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
1fba0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
1fbb0 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
1fbc0 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
1fbd0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
1fbe0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
1fbf0 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
1fc00 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
1fc10 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1fc20 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1fc30 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1fc40 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
1fc50 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
1fc60 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
1fc70 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1fc80 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1fc90 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
1fca0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
1fcb0 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
1fcc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fcd0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1fce0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
1fcf0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
1fd00 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
1fd10 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
1fd20 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1fd30 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
1fd40 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
1fd50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fd60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
1fd70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fd80 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1fd90 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  er, pSel);.     
1fda0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1fdb0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
1fdc0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1fdd0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
1fde0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
1fdf0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1fe00 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
1fe10 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
1fe20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
1fe30 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1fe40 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c   "sqlite_sq_%p",
1fe50 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
1fe60 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1fe70 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
1fe80 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1fe90 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
1fea0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
1feb0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
1fec0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
1fed0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
1fee0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
1fef0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
1ff00 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
1ff10 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20 20  = 1048576;.     
1ff20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1ff30 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1ff40 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1ff50 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1ff60 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1ff70 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1ff80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1ff90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ffa0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1ffb0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1ffc0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
1ffd0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
1ffe0 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  em(pParse, 0, pF
1fff0 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rom);.      if( 
20000 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
20010 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
20020 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
20030 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  ==0xffff ){.    
20040 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
20050 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
20060 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
20070 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
20080 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
20090 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
200a0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
200b0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
200c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
200d0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
200e0 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
200f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
20100 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
20110 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
20120 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20130 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
20140 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
20150 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
20170 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
20180 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
20190 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
201a0 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
201b0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
201c0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
201d0 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
201e0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
201f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
20200 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
20210 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
20220 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
20230 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
20240 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
20250 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
20260 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
20270 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
20280 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
20290 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
202a0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
202b0 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
202c0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
202d0 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
202e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
202f0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
20300 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
20310 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
20320 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
20330 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
20340 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
20350 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
20360 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
20370 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
20380 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20390 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
203a0 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
203b0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
203c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
203d0 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
203e0 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
203f0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
20400 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
20410 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
20420 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
20430 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
20440 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
20450 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
20460 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
20470 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
20480 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
20490 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
204a0 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
204b0 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
204c0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
204d0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
204e0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
204f0 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
20500 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
20510 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
20520 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
20530 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
20540 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
20550 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
20560 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
20570 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
20580 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
20590 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
205a0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
205b0 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
205c0 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
205d0 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
205e0 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
205f0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
20600 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
20610 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
20620 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
20630 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
20640 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
20650 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
20660 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
20670 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
20680 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
20690 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
206a0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
206b0 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
206c0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
206d0 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
206e0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
206f0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
20700 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
20710 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
20720 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
20730 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
20740 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
20750 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
20760 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
20770 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
20780 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
20790 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
207a0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
207b0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
207c0 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
207d0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
207e0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
207f0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
20800 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
20810 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
20820 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
20830 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
20840 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
20850 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
20860 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
20870 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
208a0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
208b0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a  mes)==0;..    /*
208c0 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
208d0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
208e0 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20 61  queries, it is a
208f0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
20900 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f     ** that full_
20910 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46  column_names=OFF
20920 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d   and short_colum
20930 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65  n_names=ON.  The
20940 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52  .    ** sqlite3R
20950 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
20960 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  () routine makes
20970 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61   it so. */.    a
20980 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
20990 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
209a0 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  rom)==0.        
209b0 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53    || ((flags & S
209c0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
209d0 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  es)==0 &&.      
209e0 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26          (flags &
209f0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
20a00 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20  Names)!=0) );.. 
20a10 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
20a20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
20a30 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
20a40 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
20a50 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
20a60 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
20a70 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
20a80 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
20a90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
20aa0 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70  op!=TK_ALL && (p
20ab0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
20ac0 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
20ad0 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
20ae0 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
20af0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
20b00 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
20b10 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
20b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
20b30 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
20b40 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
20b50 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
20b60 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
20b70 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
20b80 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
20b90 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
20ba0 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
20bb0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
20bc0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
20bd0 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
20be0 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
20bf0 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
20c00 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
20c10 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
20c20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
20c30 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
20c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20c50 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
20c60 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
20c70 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
20c80 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
20c90 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
20ca0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
20cb0 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
20cc0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
20cd0 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
20ce0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
20cf0 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
20d00 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
20d10 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
20d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
20d30 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
20d40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20d50 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
20d60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20d70 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20d80 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
20d90 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20da0 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
20db0 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
20dc0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
20dd0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
20de0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
20df0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
20e00 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
20e10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
20e20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
20e30 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
20e40 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
20e50 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
20e60 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
20e70 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
20e80 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
20e90 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
20ea0 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
20eb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
20ec0 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
20ed0 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
20ee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20ef0 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
20f00 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
20f10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
20f20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20f30 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
20f40 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
20f50 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
20f60 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
20f70 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
20f80 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
20f90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
20fa0 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
20fb0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
20fc0 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
20fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20fe0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
20ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21000 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
21010 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
21020 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
21030 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
21040 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
21050 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
21060 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22  iDb].zName : "*"
21070 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21080 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
21090 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
210a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
210b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
210c0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
210d0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
210e0 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
210f0 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
21100 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
21110 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
21120 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
21130 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
21140 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
21150 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
21160 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
21170 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
21180 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
21190 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
211a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
211b0 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
211c0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
211d0 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
211e0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
211f0 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
21200 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
21210 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
21220 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 0)==0.      
21230 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21240 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
21260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21270 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
21280 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
21290 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
212a0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
212b0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
212c0 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
212d0 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
212e0 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
212f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
21300 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
21310 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21320 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
21330 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
21340 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
21350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
21360 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
21370 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
21380 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
21390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
213a0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
213b0 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
213c0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
213d0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
213e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
213f0 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
21400 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
21410 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
21420 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
21430 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
21440 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
21450 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21470 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
21480 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
21490 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
214a0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
214b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
214c0 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
214d0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
214f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21510 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21520 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
21530 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
21540 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
21550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
21560 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
21570 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
21580 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
215b0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
215c0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
215f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21610 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
21620 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
21630 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
21640 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
21650 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
21660 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
21670 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
21680 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
21690 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
216a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
216b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
216d0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
216e0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
216f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
21700 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
21710 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
21720 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
21730 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
21740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
21750 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
21770 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
21780 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
21790 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
217a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
217b0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
217c0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
217d0 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29  pLeft, pExpr, 0)
217e0 3b 0a 20 20 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 20 20  }.              
21800 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
21810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21820 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
21830 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
21840 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
21850 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
21860 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
21870 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
21880 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21890 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
218a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
218b0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
218c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
218d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
218e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
218f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
21900 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
21910 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
21920 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
21930 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
21940 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
21950 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
21960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
21970 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
21980 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
21990 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
219a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
219b0 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
219c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
219d0 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
219f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21a00 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
21a10 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
21a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21a30 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
21a40 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
21a50 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
21a60 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
21a70 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
21a80 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
21a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21aa0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
21ac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21ad0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
21ae0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
21af0 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
21b30 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
21b40 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
21b60 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
21b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
21b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21b90 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
21ba0 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
21bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21bc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21bd0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
21be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21c00 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
21c10 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
21c20 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
21c30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21c40 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
21c50 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
21c60 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
21c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21c90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
21ca0 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
21cb0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
21cc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21cd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
21ce0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
21cf0 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
21d00 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
21d10 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
21d20 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
21d30 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
21d40 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
21d50 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
21d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
21d70 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
21d80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21d90 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
21da0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
21db0 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
21dc0 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
21dd0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
21de0 2a 20 46 75 6e 63 74 69 6f 6e 20 28 6f 72 20 6d  * Function (or m
21df0 61 63 72 6f 29 20 73 65 6c 65 63 74 45 78 70 61  acro) selectExpa
21e00 6e 64 65 72 57 69 74 68 20 69 73 20 75 73 65 64  nderWith is used
21e10 20 61 73 20 74 68 65 20 53 45 4c 45 43 54 20 63   as the SELECT c
21e20 61 6c 6c 62 61 63 6b 0a 2a 2a 20 62 79 20 73 71  allback.** by sq
21e30 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
21e40 64 28 29 2e 20 49 6e 20 62 75 69 6c 64 73 20 74  d(). In builds t
21e50 68 61 74 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  hat do not suppo
21e60 72 74 20 43 54 45 73 2c 20 74 68 69 73 0a 2a 2a  rt CTEs, this.**
21e70 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
21e80 6f 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  o the selectExpa
21e90 6e 64 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e  nder() function.
21ea0 20 49 6e 20 43 54 45 2d 65 6e 61 62 6c 65 64 20   In CTE-enabled 
21eb0 62 75 69 6c 64 73 2c 0a 2a 2a 20 61 6e 79 20 57  builds,.** any W
21ec0 49 54 48 20 63 6c 61 75 73 65 20 61 73 73 6f 63  ITH clause assoc
21ed0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 53  iated with the S
21ee0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
21ef0 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 70  needs to be.** p
21f00 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
21f10 74 61 63 6b 20 62 65 66 6f 72 65 20 63 61 6c 6c  tack before call
21f20 69 6e 67 20 73 65 6c 65 63 74 45 78 70 61 6e 64  ing selectExpand
21f30 65 72 28 29 2c 20 61 6e 64 20 70 6f 70 70 65 64  er(), and popped
21f40 0a 2a 2a 20 6f 66 66 20 61 67 61 69 6e 20 61 66  .** off again af
21f50 74 65 72 77 61 72 64 73 2e 20 0a 2a 2f 0a 23 69  terwards. .*/.#i
21f60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21f70 54 5f 43 54 45 0a 73 74 61 74 69 63 20 69 6e 74  T_CTE.static int
21f80 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 57   selectExpanderW
21f90 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
21fa0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
21fb0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21fc0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
21fd0 73 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  se;.  int res;. 
21fe0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
21ff0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
22000 68 29 3b 0a 20 20 72 65 73 20 3d 20 73 65 6c 65  h);.  res = sele
22010 63 74 45 78 70 61 6e 64 65 72 28 70 57 61 6c 6b  ctExpander(pWalk
22020 65 72 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  er, p);.  if( p-
22030 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73  >pWith ){.    as
22040 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
22050 69 74 68 3d 3d 70 2d 3e 70 57 69 74 68 20 29 3b  ith==p->pWith );
22060 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
22070 74 68 20 3d 20 70 2d 3e 70 57 69 74 68 2d 3e 70  th = p->pWith->p
22080 4f 75 74 65 72 3b 0a 20 20 7d 0a 20 20 72 65 74  Outer;.  }.  ret
22090 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6c 73 65  urn res;.}.#else
220a0 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 45  .#define selectE
220b0 78 70 61 6e 64 65 72 57 69 74 68 20 73 65 6c 65  xpanderWith sele
220c0 63 74 45 78 70 61 6e 64 65 72 0a 23 65 6e 64 69  ctExpander.#endi
220d0 66 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  f../*.** No-op r
220e0 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
220f0 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
22100 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
22110 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
22120 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
22130 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
22140 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
22150 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
22160 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
22170 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
22180 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
22190 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
221a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
221b0 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
221c0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
221d0 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
221e0 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
221f0 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
22200 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
22210 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
22220 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
22230 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
22240 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
22250 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
22260 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
22270 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22280 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
22290 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
222a0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
222b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
222c0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
222d0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
222e0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
222f0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
22300 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
22310 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
22320 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
22330 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
22340 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
22350 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
22360 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
22370 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
22380 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
22390 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
223a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
223b0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
223c0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
223d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
223e0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
223f0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
22400 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
22410 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
22420 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
22430 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
22440 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
22450 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
22460 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
22470 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
22480 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
22490 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
224a0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
224b0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
224c0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
224d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
224e0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
224f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
22500 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
22510 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
22520 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
22530 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
22540 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
22550 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
22560 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
22570 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
22580 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
22590 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
225a0 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
225b0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
225c0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
225d0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
225e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
225f0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
22600 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
22610 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
22620 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 57 69  selectExpanderWi
22630 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
22640 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
22650 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
22660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
22670 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
22680 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
22690 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
226a0 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
226b0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
226c0 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
226d0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
226e0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
226f0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
22700 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
22710 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
22720 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
22730 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
22740 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
22750 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
22760 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
22770 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
22780 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
22790 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
227a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
227b0 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
227c0 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
227d0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
227e0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
227f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
22800 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
22810 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
22820 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
22830 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
22840 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
22850 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
22860 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
22870 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
22880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
22890 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
228a0 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
228b0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
228c0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
228d0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
228e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
228f0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
22900 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
22910 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
22920 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
22930 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
22940 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22950 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
22960 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  =0 ){.    p->sel
22970 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
22980 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61  ypeInfo;.    pPa
22990 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
229a0 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c  Parse;.    pTabL
229b0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
229c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
229d0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
229e0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
229f0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
22a00 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
22a10 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22a20 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
22a30 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70  S(pTab!=0) && (p
22a40 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
22a50 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
22a60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
22a70 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
22a80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
22a90 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
22aa0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
22ab0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
22ac0 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ct;.        if( 
22ad0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
22ae0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
22af0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
22b00 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
22b10 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
22b20 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
22b30 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
22b40 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
22b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22b60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22b70 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22b80 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
22b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
22ba0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
22bb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22bc0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
22bd0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
22be0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
22bf0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
22c00 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
22c10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
22c20 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
22c30 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
22c40 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
22c50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
22c60 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
22c70 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
22c80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
22c90 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
22ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22cb0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
22cc0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
22cd0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
22ce0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
22cf0 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
22d00 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
22d10 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
22d20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
22d30 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
22d40 72 73 65 3b 0a 20 20 77 2e 62 53 65 6c 65 63 74  rse;.  w.bSelect
22d50 44 65 70 74 68 46 69 72 73 74 20 3d 20 31 3b 0a  DepthFirst = 1;.
22d60 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
22d70 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
22d80 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
22d90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22da0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
22db0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
22dc0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
22dd0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
22de0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
22df0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
22e00 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
22e10 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
22e20 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
22e30 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
22e40 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
22e50 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
22e60 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
22e70 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
22e80 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
22e90 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
22ea0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
22eb0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
22ec0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
22ed0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
22ee0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
22ef0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
22f00 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
22f10 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
22f20 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
22f30 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
22f40 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
22f50 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
22f60 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
22f70 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
22f80 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
22f90 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
22fa0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
22fb0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
22fc0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
22fd0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
22fe0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
22ff0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
23000 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
23010 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
23020 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
23030 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
23040 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
23050 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
23060 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
23070 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
23080 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
23090 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
230a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
230b0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
230c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
230d0 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
230e0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
230f0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
23100 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
23110 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
23120 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
23130 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
23140 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
23150 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
23160 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
23170 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
23180 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23190 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
231a0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
231b0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
231c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
231d0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
231e0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
231f0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
23200 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
23210 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
23220 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
23230 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
23240 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
23250 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
23260 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
23270 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23280 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
23290 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
232a0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
232b0 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
232c0 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
232d0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
232e0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
232f0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
23300 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
23310 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
23320 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
23330 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
23340 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
23350 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
23360 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
23370 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
23380 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
23390 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
233a0 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
233b0 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
233c0 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
233d0 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
233e0 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
233f0 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
23400 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
23410 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
23420 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
23430 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
23440 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
23450 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
23460 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
23470 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
23480 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
23490 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
234a0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
234b0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
234c0 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
234d0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
234e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
234f0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
23500 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
23510 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
23520 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
23530 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
23540 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
23550 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
23560 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
23570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23580 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
23590 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
235a0 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
235b0 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
235c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
235d0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
235e0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
235f0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
23600 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
23610 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
23620 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
23630 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
23640 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23650 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
23660 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
23670 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
23680 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
23690 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
236a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
236b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
236c0 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
236d0 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
236e0 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
236f0 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
23700 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
23710 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
23720 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
23730 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
23740 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
23750 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
23760 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
23770 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
23780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23790 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
237a0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
237b0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237d0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
237e0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
237f0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
23800 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
23810 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
23820 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
23830 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
23840 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
23850 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
23860 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
23870 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
23880 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
23890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
238a0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
238b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
238c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
238d0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
238e0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
238f0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
23900 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
23910 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
23920 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
23930 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
23940 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
23950 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
23960 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23970 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
23980 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
23990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
239a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
239b0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
239c0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
239d0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
23a00 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
23a10 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
23a20 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
23a30 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
23a40 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
23a50 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
23a60 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
23a70 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
23a80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
23a90 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
23aa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23ab0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
23ac0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
23ad0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
23ae0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
23af0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
23b00 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
23b10 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
23b20 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
23b30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
23b40 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
23b50 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
23b60 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
23b70 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
23b80 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
23b90 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
23ba0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
23bb0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
23bc0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
23bd0 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
23be0 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
23bf0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
23c00 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23c10 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
23c20 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
23c30 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
23c40 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
23c50 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
23c60 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
23c70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
23c80 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
23c90 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
23ca0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
23cb0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
23cc0 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54  t, regAgg, SQLIT
23cd0 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
23ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
23cf0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
23d00 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
23d10 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
23d20 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
23d30 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
23d40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23d50 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
23d60 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
23d70 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
23d80 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
23d90 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
23da0 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
23db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
23dc0 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
23dd0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
23de0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
23df0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
23e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
23e10 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
23e20 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
23e30 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
23e40 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
23e50 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
23e60 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
23e70 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
23e80 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
23e90 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
23ea0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
23eb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23ec0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23ed0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23ee0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
23ef0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
23f00 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
23f10 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
23f20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
23f30 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
23f40 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
23f50 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
23f60 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
23f70 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
23f80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
23f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23fa0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
23fb0 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
23fc0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
23fd0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
23fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23ff0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
24000 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
24010 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24030 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
24040 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
24050 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
24060 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
24070 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
24080 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
24090 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
240a0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
240b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
240c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
240d0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
240e0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
240f0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
24100 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24110 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
24120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24130 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
24140 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
24150 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
24160 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
24170 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
24180 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
24190 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
241a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
241b0 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
241c0 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
241d0 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
241e0 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
241f0 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
24200 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
24210 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
24220 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
24230 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
24240 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
24250 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
24260 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
24270 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
24280 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
24290 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
242a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
242b0 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
242c0 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
242d0 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
242e0 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
242f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
24300 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
24310 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
24320 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
24330 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
24340 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
24350 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
24360 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
24370 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
24380 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
24390 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
243a0 65 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  egHit);.  }.  sq
243b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
243c0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
243d0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
243e0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
243f0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
24400 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
24410 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24420 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
24430 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
24440 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
24450 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
24460 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
24470 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
24480 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
24490 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
244a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
244b0 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
244c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
244d0 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
244e0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
244f0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
24500 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
24510 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
24520 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
24530 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
24540 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
24550 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
24560 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
24570 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
24580 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
24590 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
245a0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
245b0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
245c0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
245d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
245e0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
245f0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
24600 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
24610 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24620 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
24630 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
24640 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
24650 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
24660 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
24670 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
24680 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
24690 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
246a0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
246b0 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
246c0 70 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20 43  pIdx ? " USING C
246d0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
246e0 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49  : "",.        pI
246f0 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
24700 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
24710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24720 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
24730 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
24740 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
24750 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
24760 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
24770 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
24780 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
24790 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
247a0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
247b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
247c0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
247d0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
247e0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
247f0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
24800 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
24810 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
24820 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
24830 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
24840 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
24850 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
24860 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
24870 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
24880 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
24890 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
248a0 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
248b0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
248c0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
248d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
248e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
248f0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
24900 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
24910 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
24920 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
24930 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24950 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
24960 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
24970 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
24980 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
24990 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
249a0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
249b0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
249c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
249d0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
249e0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
249f0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
24a00 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
24a20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
24a30 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62 61  iSDParm then aba
24a40 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a  ndon the rest.**
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72       of the quer
24a70 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61  y.  This destina
24a80 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49  tion implies "LI
24a90 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  MIT 1"..**.**   
24aa0 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
24ab0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73    The result mus
24ac0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  t be a single co
24ad0 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63  lumn.  Store eac
24ae0 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  h.**            
24af0 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20           row of 
24b00 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65  result as the ke
24b10 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74  y in table pDest
24b20 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20 20  ->iSDParm. .**  
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
24b50 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
24b60 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f 72  Sdst before stor
24b70 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
24b80 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
24b90 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
24ba0 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
24bb0 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
24bc0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
24bd0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
24be0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
24bf0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
24c00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24c10 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
24c20 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53 44  ed by pDest->iSD
24c30 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
24c40 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
24c50 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
24c60 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
24c70 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
24c80 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
24c90 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
24ca0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
24cb0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
24cc0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
24cd0 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m..**           
24ce0 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69            This i
24cf0 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d  s like SRT_Ephem
24d00 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20  Tab except that 
24d10 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61   is assumed to a
24d40 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a  lready be open..
24d50 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
24d60 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
24d70 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
24d80 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
24d90 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
24dc0 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
24dd0 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
24de0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
24df0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
24e00 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
24e10 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
24e20 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
24e50 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
24e60 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
24e70 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
24e80 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
24e90 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
24ea0 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
24eb0 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
24ec0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
24ed0 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
24ee0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
24ef0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
24f00 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
24f10 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
24f20 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
24f50 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
24f60 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
24f70 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
24f80 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
24f90 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
24fa0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
24fb0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69 66  Dest->iSDParm if
24fc0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
24ff0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
25000 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
25010 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
25020 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
25030 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
25040 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25050 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
25060 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
25070 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
25080 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
250a0 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
250b0 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
250c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
250d0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
250e0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
250f0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
25100 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
25110 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
25120 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
25130 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
25140 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25150 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25160 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
25170 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
25180 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
25190 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
251a0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
251b0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
251c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
251d0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
251e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
251f0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
25200 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
25210 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
25220 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
25230 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
25240 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
25250 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
25260 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
25270 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
25280 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
25290 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
252a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
252b0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
252c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
252d0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
252e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
252f0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
25300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25310 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
25320 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
25330 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
25340 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
25350 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
25360 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
25370 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
25380 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
25390 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
253a0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
253b0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
253c0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
253d0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
253e0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
253f0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
25400 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
25410 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
25420 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
25430 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
25440 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
25450 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
25460 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
25470 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
25480 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
25490 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
254a0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
254b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
254c0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
254d0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
254e0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
254f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
25500 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
25510 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
25520 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
25530 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
25540 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
25550 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
25560 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
25570 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
25580 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
25590 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
255a0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
255b0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
255c0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 41  T keyword */.  A
255d0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
255e0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
255f0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
25600 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
25610 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
25620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
25630 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
25640 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
25650 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
25660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25670 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
25680 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
25690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
256a0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
256b0 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
256c0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
256d0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
256e0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
256f0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
25700 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
25710 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
25720 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
25730 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
25740 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
25750 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25760 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
25770 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
25780 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
25790 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
257a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
257b0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
257c0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69  sAggInfo));..  i
257d0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
257e0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
257f0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
25800 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
25810 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
25820 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
25830 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
25840 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
25850 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
25860 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
25870 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  d);.    /* If OR
25880 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
25890 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
258a0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
258b0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
258c0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
258d0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
258e0 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
258f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
25900 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
25910 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
25920 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
25930 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
25940 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
25950 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
25960 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
25970 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
25980 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
25990 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
259a0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
259b0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
259c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
259d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
259e0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
259f0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
25a00 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
25a10 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
25a20 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
25a30 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
25a40 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
25a50 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
25a60 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
25a70 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
25a80 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
25a90 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
25aa0 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
25ab0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
25ac0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
25ad0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
25ae0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
25af0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
25b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25b10 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
25b20 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
25b30 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
25b40 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
25b50 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
25b60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
25b70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25b80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
25b90 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
25ba0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
25bb0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
25bc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25bd0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
25be0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25bf0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
25c00 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
25c10 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
25c20 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
25c30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25c40 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
25c50 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
25c60 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
25c70 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
25c80 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
25c90 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
25ca0 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
25cb0 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
25cc0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
25cd0 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
25ce0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
25cf0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
25d00 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
25d10 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
25d20 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
25d30 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
25d40 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
25d50 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
25d60 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
25d70 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
25d80 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
25d90 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
25da0 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
25db0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
25dc0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
25dd0 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
25de0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
25df0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
25e00 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
25e10 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
25e20 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
25e30 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
25e40 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
25e50 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
25e60 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
25e70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
25e80 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
25e90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25ea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25eb0 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
25ec0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
25ed0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
25ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
25ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
25f00 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
25f10 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
25f20 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
25f30 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
25f40 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
25f50 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  ee referred to b
25f60 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
25f70 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
25f80 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
25f90 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
25fa0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
25fb0 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
25fc0 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
25fd0 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
25fe0 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
25ff0 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
26000 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
26010 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
26020 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
26030 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
26040 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
26050 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
26060 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
26070 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
26080 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
26090 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67  ht(p);..    isAg
260a0 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
260b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
260c0 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
260d0 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
260e0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
260f0 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
26100 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
26110 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
26120 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
26130 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
26140 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
26150 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
26160 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
26170 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
26180 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
26190 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
261a0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
261b0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
261c0 3d 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  ==1 && (p->selFl
261d0 61 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69 61  ags & SF_Materia
261e0 6c 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20 26  lize)==0.      &
261f0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
26200 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
26210 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
26220 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
26230 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
26240 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
26250 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
26260 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
26270 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
26280 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
26290 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
262a0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a     int addrTop;.
262b0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 6f        int addrEo
262c0 66 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  f;.      pItem->
262d0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
262e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
262f0 20 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70 50    addrEof = ++pP
26300 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
26310 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f 64 69    /* Before codi
26320 6e 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 74  ng the OP_Goto t
26330 6f 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 73 74  o jump to the st
26340 61 72 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  art of the main 
26350 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 2a  routine,.      *
26360 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  * ensure that th
26370 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 76 65  e jump to the ve
26380 72 69 66 79 2d 73 63 68 65 6d 61 20 72 6f 75 74  rify-schema rout
26390 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ine has already.
263a0 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63 6f        ** been co
263b0 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
263c0 74 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d  the verify-schem
263d0 61 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79 20 62  a would likely b
263e0 65 20 63 6f 64 65 64 20 61 73 20 0a 20 20 20 20  e coded as .    
263f0 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
26400 20 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 66 20   co-routine. If 
26410 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
26420 20 74 68 65 6e 20 61 63 63 65 73 73 65 64 20 74   then accessed t
26430 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  he .      ** dat
26440 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 76  abase before inv
26450 6f 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72 6f 75  oking the co-rou
26460 74 69 6e 65 20 66 6f 72 20 74 68 65 20 66 69 72  tine for the fir
26470 73 74 20 74 69 6d 65 20 28 66 6f 72 20 0a 20 20  st time (for .  
26480 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 20 74      ** example t
26490 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 4c  o initialize a L
264a0 49 4d 49 54 20 72 65 67 69 73 74 65 72 20 66 72  IMIT register fr
264b0 6f 6d 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29  om a sub-select)
264c0 2c 20 69 74 20 77 6f 75 6c 64 20 0a 20 20 20 20  , it would .    
264d0 20 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20 73 6f    ** be doing so
264e0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
264f0 76 65 72 69 66 69 65 64 20 74 68 65 20 73 63 68  verified the sch
26500 65 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema version and 
26510 6f 62 74 61 69 6e 65 64 20 0a 20 20 20 20 20 20  obtained .      
26520 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ** the required 
26530 64 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20 74 69  db locks. See ti
26540 63 6b 65 74 20 64 36 62 33 36 62 65 33 38 2e 20  cket d6b36be38. 
26550 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26560 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
26570 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20  a(pParse, -1);. 
26580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26590 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
265a0 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f  o);.      addrTo
265b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
265c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp1(v, OP_Open
265d0 50 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d 3e 69  Pseudo, pItem->i
265e0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
265f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
26600 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
26610 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26620 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 25  "coroutine for %
26630 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
26640 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
26650 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
26660 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
26670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26680 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
26690 67 65 72 2c 20 30 2c 20 61 64 64 72 45 6f 66 29  ger, 0, addrEof)
266a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
266b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
266c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
266d0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
266e0 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
266f0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
26700 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78  eturn);.      ex
26710 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
26720 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
26730 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
26740 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
26750 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26760 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
26770 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
26780 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  tem->pTab->nRowE
26790 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70  st = (unsigned)p
267a0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
267b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69  .      pItem->vi
267c0 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  aCoroutine = 1;.
267d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
267e0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
267f0 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73 74  rTop, dest.iSdst
26800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26810 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
26820 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e 53  addrTop, dest.nS
26830 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
26840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26850 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
26860 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20  addrEof);.      
26870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26880 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
26890 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
268a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
268b0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22  ent((v, "end %s"
268c0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
268d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
268e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
268f0 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b  e(v, addrTop-1);
26900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
26910 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
26920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
26930 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  se{.      /* Gen
26940 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
26950 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c  ne that will fil
26960 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  l an ephemeral t
26970 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20  able with.      
26980 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
26990 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e  f this subquery.
269a0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
269b0 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a  lSub will point.
269c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
269d0 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67  address of the g
269e0 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74  enerated subrout
269f0 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67  ine.  pItem->reg
26a00 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  Return.      ** 
26a10 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c  is a register al
26a20 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
26a30 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
26a40 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20  eturn address.  
26a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
26a60 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20   topAddr;.      
26a70 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30  int onceAddr = 0
26a80 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41  ;.      int retA
26a90 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
26aa0 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
26ab0 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
26ac0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
26ad0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
26ae0 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
26af0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
26b00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
26b10 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
26b20 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
26b30 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
26b40 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
26b50 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70  ;.      VdbeNoop
26b60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
26b70 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70 49  erialize %s", pI
26b80 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
26b90 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ));.      if( pI
26ba0 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
26bb0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
26bc0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
26bd0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
26be0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
26bf0 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
26c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
26c10 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
26c20 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
26c30 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
26c40 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
26c50 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
26c60 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
26c70 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
26c80 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
26c90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
26ca0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
26cb0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
26cc0 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
26cd0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78  ursor);.      ex
26ce0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
26cf0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
26d00 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
26d10 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
26d20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26d30 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
26d40 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
26d50 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  tem->pTab->nRowE
26d60 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70  st = (unsigned)p
26d70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
26d80 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
26d90 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
26da0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
26db0 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
26dc0 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
26dd0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
26de0 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
26df0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
26e00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26e10 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
26e20 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
26e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26e40 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
26e50 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
26e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
26e70 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
26e80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
26e90 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
26ea0 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
26eb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
26ec0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
26ed0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
26ee0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
26ef0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
26f00 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
26f10 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
26f20 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
26f30 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
26f40 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
26f50 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
26f60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
26f70 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
26f80 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
26f90 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
26fa0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
26fb0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
26fc0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
26fd0 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
26fe0 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
26ff0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
27000 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
27010 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27020 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
27030 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
27040 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
27050 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
27060 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
27070 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
27080 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
27090 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
270a0 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
270b0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
270c0 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  , *pRight = 0;. 
270d0 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
270e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
270f0 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  lect;.      for(
27100 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
27110 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
27120 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
27130 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
27140 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
27150 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
27160 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
27170 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
27180 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
27190 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e   mxSelect = db->
271a0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
271b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
271c0 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ECT];.      if( 
271d0 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e  mxSelect && cnt>
271e0 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  mxSelect ){.    
271f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27200 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
27210 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
27220 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
27230 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
27240 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
27250 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20   }.    }.    rc 
27260 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
27270 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
27280 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
27290 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
272a0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
272b0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  reSelectId);.   
272c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
272d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
272e0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
272f0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
27300 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
27310 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a  and they are.  *
27320 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
27330 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  n disable the OR
27340 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69  DER BY clause si
27350 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  nce the GROUP BY
27360 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65  .  ** will cause
27370 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
27380 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72  e out in the cor
27390 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69  rect order.  Thi
273a0 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74  s is.  ** an opt
273b0 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
273c0 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
273d0 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
273e0 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73  ardless..  ** Us
273f0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f  e the SQLITE_Gro
27400 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77  upByOrder flag w
27410 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ith SQLITE_TESTC
27420 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20  TRL_OPTIMIZER.  
27430 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ** to disable th
27440 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
27450 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
27460 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oses..  */.  if(
27470 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27480 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75  Compare(p->pGrou
27490 70 42 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d  pBy, pOrderBy, -
274a0 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  1)==0.         &
274b0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
274c0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
274d0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29  _GroupByOrder) )
274e0 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
274f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
27500 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
27510 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
27520 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
27530 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
27540 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
27550 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
27560 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
27570 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
27580 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
27590 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
275a0 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
275b0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
275c0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
275d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
275e0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
275f0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
27600 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
27610 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
27620 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
27630 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
27640 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20  . GROUP BY xyz. 
27650 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
27660 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
27670 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
27680 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
27690 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
276a0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
276b0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
276c0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
276d0 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
276e0 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
276f0 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
27700 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
27710 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
27720 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
27730 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
27740 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
27750 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
27760 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
27770 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
27780 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
27790 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
277a0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
277b0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
277c0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
277d0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f  prListCompare(pO
277e0 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
277f0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
27800 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
27810 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
27820 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
27830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
27840 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
27850 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
27860 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
27870 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  By;.    pOrderBy
27880 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74   = 0;.    /* Not
27890 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
278a0 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
278b0 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
278c0 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
278d0 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
278e0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
278f0 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
27900 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
27910 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
27920 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
27930 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
27940 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
27950 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
27960 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
27970 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
27980 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20  sTnct );.  }..  
27990 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
279a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
279b0 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
279c0 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
279d0 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
279e0 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
279f0 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
27a00 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
27a10 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
27a20 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
27a30 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
27a40 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
27a50 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
27a60 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
27a70 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
27a80 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
27a90 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
27aa0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
27ab0 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
27ac0 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
27ad0 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
27ae0 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
27af0 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
27b00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
27b10 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
27b20 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
27b30 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
27b40 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
27b50 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
27b60 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
27b70 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
27b80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
27b90 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
27ba0 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
27bb0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
27bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27bd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
27be0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
27c10 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
27c20 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
27c50 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
27c60 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  O);.  }else{.   
27c70 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
27c80 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
27c90 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
27ca0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
27cb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
27cc0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
27cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
27ce0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
27cf0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
27d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27d10 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
27d20 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
27d30 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
27d40 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
27d50 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
27d60 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
27d70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
27d80 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
27d90 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
27da0 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
27db0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
27dc0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
27dd0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
27de0 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
27df0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
27e00 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
27e10 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
27e20 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
27e30 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
27e40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
27e50 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
27e60 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
27e70 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
27e80 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
27e90 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
27ea0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
27eb0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
27ec0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
27ed0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
27ee0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
27ef0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
27f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
27f10 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
27f20 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
27f50 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
27f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f80 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
27f90 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
27fa0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 2c  rse, p->pEList),
27fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
27fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
27ff0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
28000 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
28010 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
28020 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
28030 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
28040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
28050 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
28060 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
28070 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
28080 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
28090 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
280a0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
280b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
280c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
280d0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
280e0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
280f0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
28100 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
28110 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  : 0);..    /* Be
28120 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
28130 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
28140 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
28150 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
28160 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
28170 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  e, pOrderBy, p->
28180 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  pEList,.        
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67         wctrlFlag
281b0 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
281c0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
281d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
281e0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
281f0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
28200 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
28210 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
28220 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
28230 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
28240 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
28250 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
28260 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
28270 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
28280 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
28290 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
282a0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
282b0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
282c0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
282d0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
282e0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 73 71  ( pOrderBy && sq
282f0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
28300 72 65 64 28 70 57 49 6e 66 6f 29 20 29 20 70 4f  red(pWInfo) ) pO
28310 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20  rderBy = 0;..   
28320 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
28330 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
28340 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
28350 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
28360 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
28370 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
28380 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
28390 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
283a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
283b0 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
283c0 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
283d0 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
283e0 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
283f0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
28400 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28410 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
28420 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
28430 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
28440 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
28450 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
28460 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
28470 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
28480 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
28490 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
284a0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
284b0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
284c0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
284d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
284e0 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
284f0 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
28510 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
28520 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
28530 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
28540 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
28550 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
28560 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
28570 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
28580 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
28590 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
285a0 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
285b0 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
285c0 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
285d0 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
285e0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
285f0 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
28600 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
28610 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
28620 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
28630 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
28640 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
28650 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
28660 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
28670 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
28680 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
28690 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
286a0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
286b0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
286c0 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
286d0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
286e0 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
286f0 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
28700 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
28730 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
28740 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
28750 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
28780 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
28790 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
287a0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
287b0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
287c0 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
287d0 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
287e0 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
287f0 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
28800 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
28810 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
28820 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
28830 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
28840 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
28850 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
28860 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
28870 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
28880 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
28890 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
288a0 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
288b0 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
288c0 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
288d0 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  he sorter */..  
288e0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
288f0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
28900 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
28910 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
28920 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
28930 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
28940 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
28950 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28980 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
28990 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
289a0 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
289b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
289c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
289d0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
289e0 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
289f0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
28a00 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
28a10 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
28a20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
28a30 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
28a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
28a50 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
28a60 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
28a70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
28a80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
28a90 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
28aa0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
28ab0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
28ac0 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
28ad0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
28ae0 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
28af0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
28b00 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
28b10 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
28b20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
28b30 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
28b40 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
28b50 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
28b60 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
28b70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
28b80 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
28b90 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
28ba0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
28bb0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
28bc0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
28bd0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
28be0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
28bf0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
28c00 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
28c10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
28c20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
28c30 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
28c40 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
28c50 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
28c60 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
28c70 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
28c80 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
28c90 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
28ca0 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
28cb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
28cc0 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
28cd0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
28ce0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
28cf0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
28d00 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
28d10 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
28d20 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
28d30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
28d40 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
28d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
28d60 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
28d70 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
28d80 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
28d90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28da0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
28db0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
28dc0 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
28dd0 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
28de0 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
28df0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
28e00 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
28e10 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
28e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
28e30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
28e40 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
28e50 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
28e60 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
28e70 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
28e80 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
28e90 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
28ea0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
28eb0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
28ec0 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
28ed0 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
28ee0 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
28ef0 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
28f00 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
28f10 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
28f20 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
28f30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
28f40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
28f50 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
28f60 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
28f70 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
28f80 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
28f90 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
28fa0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
28fb0 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
28fc0 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
28fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28fe0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
28ff0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
29000 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
29010 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
29020 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
29030 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
29040 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
29050 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61   /* A-vs-B compa
29060 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20  rision jump */. 
29070 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74       int addrOut
29080 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72  putRow;  /* Star
29090 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
290a0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
290b0 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
290c0 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
290d0 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e  Row;   /* Return
290e0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
290f0 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
29100 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
29110 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
29120 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  t;   /* Set the 
29130 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
29140 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69  eturn */.      i
29150 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
29160 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65  ;  /* Top of the
29170 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
29180 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72       int addrSor
29190 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20  tingIdx; /* The 
291a0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
291b0 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
291c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
291d0 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
291e0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
291f0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
29200 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29210 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
29220 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  Reset;       /* 
29230 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
29240 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
29250 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
29260 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
29270 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
29280 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
29290 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
292a0 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
292b0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
292c0 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
292d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
292e0 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
292f0 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
29300 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
29310 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
29320 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
29330 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
29340 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
29350 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
29360 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
29370 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
29380 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
29390 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
293a0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
293b0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
293c0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
293d0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
293e0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
293f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
29400 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
29410 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
29420 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
29430 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
29440 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
29450 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
29460 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
29470 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
29480 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
29490 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
294a0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
294b0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
294c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
294d0 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
294e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
294f0 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
29500 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
29510 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
29520 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29530 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
29540 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
29550 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29560 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
29570 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29580 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
29590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
295a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
295b0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
295c0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
295d0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
295e0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
295f0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
29600 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
29610 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
29620 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
29630 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
29640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29650 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
29660 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
29670 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
29680 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
29690 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
296a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
296b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
296c0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
296d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
296e0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
296f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
29700 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
29710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
29720 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
29730 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
29740 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
29750 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
29760 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
29770 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
29780 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
29790 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
297a0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
297b0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
297c0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
297d0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
297e0 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
297f0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
29800 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
29810 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
29820 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
29830 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
29840 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
29850 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
29860 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29880 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
29890 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
298a0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
298b0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
298c0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
298d0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
298e0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a 20   pGroupBy, 0, . 
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29910 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20 30  WHERE_GROUPBY, 0
29920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
29930 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
29940 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
29950 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
29960 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
29970 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
29980 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
29990 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
299a0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
299b0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
299c0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
299d0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
299e0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
299f0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
29a00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
29a10 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
29a20 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
29a30 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
29a40 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
29a50 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
29a60 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
29a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29a80 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
29a90 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
29aa0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
29ab0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
29ac0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
29ad0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
29ae0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
29af0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
29b00 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
29b10 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
29b20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
29b30 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
29b40 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
29b50 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
29b60 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
29b70 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
29b80 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
29b90 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
29ba0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
29bb0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
29bc0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
29bd0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
29be0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
29bf0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
29c00 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
29c10 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
29c20 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
29c30 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
29c40 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
29c50 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
29c60 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
29c70 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
29c80 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
29c90 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
29ca0 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
29cb0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
29cc0 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
29cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
29ce0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
29cf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
29d00 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
29d10 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
29d20 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
29d30 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
29d40 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
29d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d60 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
29d70 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
29d80 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
29d90 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
29da0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
29db0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
29dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29dd0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
29de0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
29df0 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
29e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
29e20 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
29e30 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
29e40 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
29e50 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
29e60 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
29e70 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
29e80 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
29e90 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
29ea0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
29eb0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
29ec0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
29ed0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
29ee0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
29ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
29f00 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
29f10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
29f20 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
29f30 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
29f40 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
29f50 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
29f80 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
29f90 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
29fa0 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
29fb0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
29fc0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
29fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
29ff0 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
2a000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a010 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2a020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a030 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
2a040 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
2a050 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2a060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a070 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
2a080 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
2a090 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
2a0a0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2a0b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a0c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
2a0d0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2a0e0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
2a0f0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2a100 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2a110 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
2a120 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2a130 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2a140 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2a150 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
2a160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2a170 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2a180 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2a190 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
2a1a0 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
2a1b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a1c0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
2a1d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2a1e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2a1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a200 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
2a210 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
2a220 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
2a230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a250 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
2a260 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2a270 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
2a280 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2a290 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
2a2a0 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
2a2b0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
2a2c0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
2a2d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a2e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a2f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2a300 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
2a310 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2a320 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
2a330 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
2a340 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
2a350 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
2a360 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
2a370 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
2a380 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
2a390 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
2a3a0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2a3b0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
2a3c0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
2a3d0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
2a3e0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
2a3f0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
2a400 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
2a410 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
2a420 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
2a430 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2a440 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2a450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a460 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2a470 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
2a480 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2a490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a4a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2a4b0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
2a4c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f  o.sortingIdx, so
2a4d0 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rtOut);.      }.
2a4e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2a4f0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
2a500 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2a510 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2a520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2a530 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2a540 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
2a550 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
2a560 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
2a570 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( j==0 ) sqlite3
2a580 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2a590 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
2a5a0 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  E);.        }els
2a5b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
2a5c0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
2a5d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2a5e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2a5f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
2a600 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
2a610 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2a620 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a640 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
2a650 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
2a660 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2a690 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
2a6a0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
2a6b0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2a6c0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
2a6d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2a6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a6f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
2a700 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31  ump, j1+1, 0, j1
2a710 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  +1);..      /* G
2a720 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
2a730 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
2a740 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
2a750 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
2a760 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
2a770 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
2a780 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
2a790 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
2a7a0 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
2a7b0 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
2a7c0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
2a7d0 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
2a7e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2a7f0 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
2a800 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
2a810 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
2a820 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
2a830 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
2a840 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
2a850 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
2a860 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
2a870 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
2a880 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2a890 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
2a8a0 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
2a8b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
2a8c0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
2a8d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a8e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2a8f0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
2a900 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
2a910 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
2a920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a930 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2a940 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
2a950 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2a960 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2a970 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
2a980 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
2a990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a9a0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
2a9b0 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
2a9c0 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
2a9d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
2a9e0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
2a9f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2aa00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2aa10 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2aa20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2aa30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2aa40 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
2aa50 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2aa60 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
2aa70 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2aa80 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
2aa90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
2aaa0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2aab0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
2aac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2aad0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
2aae0 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2aaf0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2ab00 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2ab10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ab20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2ab30 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2ab40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2ab50 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2ab60 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2ab70 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2ab80 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2ab90 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2aba0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2abb0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2abc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2abd0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2abe0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2abf0 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2ac00 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Loop);.      }el
2ac10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ac20 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2ac30 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
2ac40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2ac50 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
2ac60 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
2ac70 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
2ac80 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
2ac90 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
2aca0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2acb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2acc0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2acd0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2ace0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2acf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2ad00 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
2ad10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
2ad20 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
2ad30 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
2ad40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ad50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2ad60 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
2ad70 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2ad80 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2ad90 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
2ada0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2adb0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2adc0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
2add0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
2ade0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
2adf0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
2ae00 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
2ae10 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2ae20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
2ae30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2ae40 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
2ae50 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
2ae60 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
2ae70 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
2ae80 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
2ae90 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
2aea0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
2aeb0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2aec0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2aed0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
2aee0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
2aef0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
2af00 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2af10 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
2af20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2af30 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2af40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2af50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2af60 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
2af70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2af80 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
2af90 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2afa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2afb0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2afc0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2afd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2afe0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2aff0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
2b000 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
2b010 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2b020 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b030 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2b040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b050 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
2b060 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2b070 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
2b080 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
2b090 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
2b0a0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
2b0b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2b0c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2b0d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2b0e0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2b0f0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2b100 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
2b110 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2b120 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2b130 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
2b140 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2b150 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
2b160 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2b170 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2b180 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2b190 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
2b1a0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2b1b0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
2b1c0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2b1f0 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
2b200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b210 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2b220 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2b230 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2b240 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2b250 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
2b260 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
2b270 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2b280 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2b290 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
2b2a0 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
2b2b0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
2b2c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2b2d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2b2e0 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
2b2f0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2b300 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2b310 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2b320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b330 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2b340 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
2b350 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
2b360 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
2b370 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2b380 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
2b390 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
2b3a0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
2b3b0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
2b3c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b3d0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
2b3e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2b3f0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
2b400 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
2b410 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
2b420 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2b430 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
2b440 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
2b450 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
2b460 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
2b470 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
2b480 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
2b490 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
2b4a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2b4b0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
2b4c0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
2b4d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2b4e0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
2b4f0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
2b500 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
2b510 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
2b520 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2b530 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
2b540 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
2b550 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
2b560 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
2b570 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2b580 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
2b590 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
2b5a0 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
2b5b0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
2b5c0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2b5d0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
2b5e0 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
2b5f0 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
2b600 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
2b610 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
2b620 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
2b630 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
2b640 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
2b650 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
2b660 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
2b670 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
2b680 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
2b690 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
2b6a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b6b0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
2b6c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2b6d0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
2b6e0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
2b6f0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
2b700 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
2b710 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
2b720 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2b730 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
2b740 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
2b750 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2b760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b770 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2b780 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
2b790 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2b7a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b7b0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
2b7c0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
2b7d0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2b7e0 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b800 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
2b810 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
2b820 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
2b830 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
2b840 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2b850 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
2b860 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
2b870 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2b880 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2b890 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
2b8a0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2b8b0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2b8c0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2b8d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
2b8e0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2b8f0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
2b900 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
2b910 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
2b920 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b930 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
2b940 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
2b950 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
2b960 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
2b970 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b980 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
2b990 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
2b9a0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
2b9b0 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
2b9c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b9d0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
2b9e0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
2b9f0 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
2ba00 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
2ba10 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
2ba20 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
2ba30 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
2ba40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ba50 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2ba60 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
2ba70 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
2ba80 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
2ba90 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
2baa0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
2bab0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2bac0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2bad0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
2bae0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2baf0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
2bb00 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2bb10 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
2bb20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
2bb30 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
2bb40 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
2bb50 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
2bb60 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
2bb70 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
2bb90 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
2bba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2bbb0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
2bbc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
2bbd0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
2bbe0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
2bbf0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
2bc00 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
2bc10 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
2bc20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2bc30 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
2bc40 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
2bc50 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
2bc60 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
2bc70 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
2bc80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bc90 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2bca0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
2bcb0 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
2bcc0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
2bcd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2bce0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2bcf0 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
2bd00 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2bd10 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
2bd20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2bd30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2bd40 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
2bd50 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
2bd60 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
2bd70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bd80 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
2bd90 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
2bda0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2bdb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2bdc0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
2bdd0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
2bde0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
2bdf0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
2be00 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2be10 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
2be20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
2be30 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
2be40 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2be50 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
2be60 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
2be70 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2be80 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
2be90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2bea0 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
2beb0 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
2bec0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
2bed0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
2bee0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
2bef0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
2bf00 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
2bf10 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
2bf20 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
2bf30 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
2bf40 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
2bf50 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
2bf60 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
2bf70 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
2bf80 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
2bf90 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
2bfa0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
2bfb0 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
2bfc0 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
2bfd0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
2bfe0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
2bff0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
2c000 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
2c010 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
2c020 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
2c030 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
2c040 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
2c050 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
2c060 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
2c070 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
2c080 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
2c090 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
2c0a0 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
2c0b0 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
2c0c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2c0d0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
2c0e0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
2c0f0 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
2c100 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2c110 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
2c120 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
2c130 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
2c140 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
2c150 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
2c160 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
2c170 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
2c180 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
2c190 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
2c1a0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
2c1b0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
2c1c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c1d0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
2c1e0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
2c1f0 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
2c200 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
2c210 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2c220 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
2c230 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
2c240 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
2c250 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
2c260 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
2c270 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
2c280 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
2c290 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
2c2a0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
2c2b0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
2c2c0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
2c2d0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
2c2e0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
2c2f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
2c300 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
2c310 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
2c320 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
2c330 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
2c340 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
2c350 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
2c360 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
2c370 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2c380 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c390 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
2c3b0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
2c3c0 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
2c3d0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
2c3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
2c3f0 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
2c400 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
2c410 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
2c420 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
2c430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
2c440 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
2c450 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
2c460 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
2c470 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
2c480 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
2c490 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
2c4a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c4c0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
2c4d0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
2c4e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2c4f0 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
2c500 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2c510 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
2c520 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2c530 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c540 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2c550 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
2c560 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
2c570 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2c580 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
2c590 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
2c5a0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
2c5b0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
2c5c0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
2c5d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
2c5e0 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
2c5f0 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
2c600 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2c610 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2c620 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2c630 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c640 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2c650 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
2c660 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
2c670 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2c680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c690 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c6a0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
2c6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2c6c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2c6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2c6e0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2c6f0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2c700 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
2c710 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
2c720 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
2c730 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
2c740 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2c750 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2c760 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
2c770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c780 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
2c790 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
2c7a0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
2c7b0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
2c7c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
2c7d0 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
2c7f0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
2c800 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
2c810 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
2c820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2c830 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2c840 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
2c850 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
2c860 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2c870 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c880 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2c890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2c8a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2c8b0 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
2c8c0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2c8d0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
2c8e0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2c8f0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
2c900 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20   0, 0, 0, 0, .  
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
2c930 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
2c940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2c950 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2c960 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
2c970 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2c980 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
2c990 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
2c9a0 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
2c9b0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
2c9c0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2c9d0 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
2c9e0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
2c9f0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2ca00 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
2ca10 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
2ca20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2ca30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2ca40 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
2ca50 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
2ca60 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
2ca70 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
2ca80 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
2ca90 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
2caa0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2cab0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2cac0 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20  (pParse, "ORDER 
2cad0 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
2cae0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
2caf0 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
2cb00 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
2cb10 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
2cb20 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
2cb30 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
2cb40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2cb50 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
2cb60 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
2cb70 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2cb80 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
2cb90 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
2cba0 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
2cbb0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
2cbc0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
2cbd0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
2cbe0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
2cbf0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2cc00 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
2cc10 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
2cc20 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
2cc30 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
2cc40 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
2cc50 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2cc60 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2cc70 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2cc80 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
2cc90 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
2cca0 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
2ccb0 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
2ccc0 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
2ccd0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2cce0 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
2ccf0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
2cd00 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
2cd10 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
2cd20 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2cd30 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
2cd40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2cd50 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
2cd60 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2cd70 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
2cd80 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
2cd90 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
2cda0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2cdb0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
2cdc0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
2cdd0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
2cde0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
2cdf0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
2ce00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ce10 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63   explainOneSelec
2ce20 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
2ce30 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
2ce40 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2ce50 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54  f(pVdbe, "SELECT
2ce60 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65   ");.  if( p->se
2ce70 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2ce80 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2ce90 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  te) ){.    if( p
2cea0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ceb0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2cec0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ced0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44  Printf(pVdbe, "D
2cee0 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20  ISTINCT ");.    
2cef0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  }.    if( p->sel
2cf00 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2cf10 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  gate ){.      sq
2cf20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2cf30 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66  tf(pVdbe, "agg_f
2cf40 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  lag ");.    }.  
2cf50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2cf60 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2cf70 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2cf80 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22  ntf(pVdbe, "   "
2cf90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2cfa0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2cfb0 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74  pVdbe, p->pEList
2cfc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2cfd0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2cfe0 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
2cff0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
2d000 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2d010 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2d020 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d  ntf(pVdbe, "FROM
2d030 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2d040 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2d050 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
2d060 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
2d070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
2d080 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2d090 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
2d0a0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
2d0b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d0c0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25  rintf(pVdbe, "{%
2d0d0 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d  d,*} = ", pItem-
2d0e0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2d0f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2d100 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
2d110 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
2d120 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d  ect(pVdbe, pItem
2d130 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2d140 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2d150 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
2d160 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d170 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2d180 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49  tabname=%s)", pI
2d190 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2d1a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d1b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
2d1c0 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
2d1d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2d1e0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2d1f0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e   "%s", pItem->zN
2d200 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
2d210 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2d220 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
2d230 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d240 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2d250 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
2d260 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
2d270 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2d280 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2d290 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
2d2a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d2b0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45  intf(pVdbe, " LE
2d2c0 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20  FT-JOIN");.     
2d2d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2d2e0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2d2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2d300 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56  te3ExplainPop(pV
2d310 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2d320 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
2d330 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d340 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48  rintf(pVdbe, "WH
2d350 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ERE ");.    sqli
2d360 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2d370 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29  Vdbe, p->pWhere)
2d380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2d390 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2d3a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
2d3b0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
2d3c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2d3d0 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59  (pVdbe, "GROUPBY
2d3e0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2d3f0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2d400 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70  pVdbe, p->pGroup
2d410 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2d420 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2d430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2d440 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
2d450 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2d460 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e  tf(pVdbe, "HAVIN
2d470 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  G ");.    sqlite
2d480 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2d490 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  be, p->pHaving);
2d4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2d4b0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2d4c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
2d4d0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
2d4e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d4f0 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20  pVdbe, "ORDERBY 
2d500 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2d510 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2d520 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Vdbe, p->pOrderB
2d530 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2d540 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2d550 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
2d560 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
2d570 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2d580 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22  (pVdbe, "LIMIT "
2d590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2d5a0 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2d5b0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
2d5c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2d5d0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2d5e0 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
2d5f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2d600 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2d610 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20  , "OFFSET ");.  
2d620 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d630 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2d640 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
2d650 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2d660 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  dbe);.  }.}.void
2d670 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2d680 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2d690 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2d6a0 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2d6b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d6c0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e  rintf(pVdbe, "(n
2d6d0 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20  ull-select)");. 
2d6e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2d6f0 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69 6f   while( p->pPrio
2d700 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  r ){.    p->pPri
2d710 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  or->pNext = p;. 
2d720 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
2d730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2d740 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
2d750 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
2d760 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
2d770 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b  elect(pVdbe, p);
2d780 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
2d790 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  t;.    if( p==0 
2d7a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
2d7b0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2d7c0 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2d7d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2d7e0 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65  Vdbe, "%s\n", se
2d7f0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
2d800 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
2d810 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2d820 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20  Vdbe, "END");.  
2d830 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
2d840 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20  p(pVdbe);.}../* 
2d850 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
2d860 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
2d870 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
2d880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d8c0 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
2d8d0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
2d8e0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
2d8f0 4c 41 49 4e 29 20 2a 2f 0a                       LAIN) */.