/ Hex Artifact Content
Login

Artifact 41df0e4dd1d167dc8b39047c84e1b8b51516a237:


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 52 65 74    }.}../*.** Ret
0cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0cc0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
0cd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
0ce0: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a   in a compound..
0cf0: 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  */.static Select
0d00: 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28   *findRightmost(
0d10: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68  Select *p){.  wh
0d20: 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20  ile( p->pNext ) 
0d30: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
0d40: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0d50: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
0d60: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
0d70: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0d80: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0d90: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0da0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0db0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0dc0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0dd0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0de0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0df0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0e00: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0e10: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0e20: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0e30: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0e40: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0e50: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0e60: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0e70: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0e80: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0e90: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0ea0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0eb0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0ec0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0ed0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0ee0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0ef0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0f00: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0f10: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0f20: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0f30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0f40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0f50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0f60: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0f70: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0f80: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0f90: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0fa0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20  Token *p;.      
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33         /*   0123
0fd0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
0fe0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
0ff0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1000: 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d   char zKeyText[]
1010: 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75   = "naturaleftou
1020: 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72  terightfullinner
1030: 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63  cross";.  static
1040: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1050: 20 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20      u8 i;       
1060: 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
1070: 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e   keyword text in
1080: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20   zKeyText[] */. 
1090: 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20     u8 nChar;    
10a0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
10b0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72   keyword in char
10c0: 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38  acters */.    u8
10d0: 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f   code;     /* Jo
10e0: 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a  in type mask */.
10f0: 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d    } aKeyword[] =
1100: 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61   {.    /* natura
1110: 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54  l */ { 0,  7, JT
1120: 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20  _NATURAL        
1130: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1140: 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36  * left    */ { 6
1150: 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  ,  4, JT_LEFT|JT
1160: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1170: 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20  },.    /* outer 
1180: 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54    */ { 10, 5, JT
1190: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
11a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
11b0: 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31  * right   */ { 1
11c0: 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a  4, 5, JT_RIGHT|J
11d0: 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20  T_OUTER         
11e0: 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20  },.    /* full  
11f0: 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54    */ { 19, 4, JT
1200: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
1210: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f  T_OUTER },.    /
1220: 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32  * inner   */ { 2
1230: 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20  3, 5, JT_INNER  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20  },.    /* cross 
1260: 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54    */ { 28, 5, JT
1270: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
1280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
1290: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
12a0: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
12b0: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
12c0: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
12d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
12e0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
12f0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
1300: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
1310: 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  j<ArraySize(aKey
1320: 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  word); j++){.   
1330: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65     if( p->n==aKe
1340: 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a  yword[j].nChar .
1350: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
1360: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
1370: 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54  ar*)p->z, &zKeyT
1380: 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  ext[aKeyword[j].
1390: 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  i], p->n)==0 ){.
13a0: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
13b0: 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e   |= aKeyword[j].
13c0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
13d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13e0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
13f0: 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c   j==0 || j==1 ||
1400: 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c   j==2 || j==3 ||
1410: 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c   j==4 || j==5 ||
1420: 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28   j==6 );.    if(
1430: 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b   j>=ArraySize(aK
1440: 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20  eyword) ){.     
1450: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1460: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1480: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1490: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
14a0: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
14b0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
14c0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
14d0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
14e0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
14f0: 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a  har *zSp = " ";.
1500: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d      assert( pB!=
1510: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d  0 );.    if( pC=
1520: 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20  =0 ){ zSp++; }. 
1530: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1540: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1550: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1560: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1570: 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25         "%T %T%s%
1580: 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c  T", pA, pB, zSp,
1590: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
15a0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
15b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e   }else if( (join
15c0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
15d0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
15e0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
15f0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29  _LEFT|JT_RIGHT))
1600: 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  !=JT_LEFT ){.   
1610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1620: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1630: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
1640: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
1650: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
1660: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1670: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1680: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1690: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
16a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
16b0: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
16c0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
16d0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
16e0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
16f0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1700: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1710: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1720: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1750: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1770: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1780: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1790: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
17a0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
17b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
17c0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
17d0: 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69  first N tables i
17e0: 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66  n pSrc, from lef
17f0: 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b  t to right, look
1800: 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  ing for a.** tab
1810: 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  le that has a co
1820: 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e  lumn named zCol.
1830: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f    .**.** When fo
1840: 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20  und, set *piTab 
1850: 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68  and *piCol to th
1860: 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e  e table index an
1870: 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a  d column index.*
1880: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  * of the matchin
1890: 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74  g column and ret
18a0: 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20  urn TRUE..**.** 
18b0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65  If not found, re
18c0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
18d0: 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41  tatic int tableA
18e0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20  ndColumnIndex(. 
18f0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1900: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1910: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72  f tables to sear
1920: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ch */.  int N,  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1940: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
1950: 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f   in pSrc->a[] to
1960: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e   search */.  con
1970: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1980: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1990: 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c   column we are l
19a0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
19b0: 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20  int *piTab,     
19c0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
19d0: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d  dex of pSrc->a[]
19e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
19f0: 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  piCol           
1a00: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
1a10: 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62  f pSrc->a[*piTab
1a20: 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68  ].pTab->aCol[] h
1a30: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1a40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a50: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1a60: 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1a70: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1a80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
1a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1aa0: 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a   matching zCol *
1ab0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69  /..  assert( (pi
1ac0: 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d  Tab==0)==(piCol=
1ad0: 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20  =0) );  /* Both 
1ae0: 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e  or neither are N
1af0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
1b00: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
1b10: 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e   iCol = columnIn
1b20: 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  dex(pSrc->a[i].p
1b30: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
1b40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1b50: 20 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29       if( piTab )
1b60: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62  {.        *piTab
1b70: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70   = i;.        *p
1b80: 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  iCol = iCol;.   
1b90: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ba0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1bb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1bc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1bd0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
1be0: 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62   terms implied b
1bf0: 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f  y JOIN syntax to
1c00: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1c10: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
1c20: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1c30: 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74  ement. The new t
1c40: 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  erm, which.** is
1c50: 20 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20   ANDed with the 
1c60: 65 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63  existing WHERE c
1c70: 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65  lause, is of the
1c80: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
1c90: 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62  (tab1.col1 = tab
1ca0: 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68  2.col2).**.** wh
1cb0: 65 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20  ere tab1 is the 
1cc0: 69 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e  iSrc'th table in
1cd0: 20 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e   SrcList pSrc an
1ce0: 64 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a  d tab2 is the .*
1cf0: 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43  * (iSrc+1)'th. C
1d00: 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f  olumn col1 is co
1d10: 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66  lumn iColLeft of
1d20: 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20   tab1, and col2 
1d30: 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  is.** column iCo
1d40: 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a  lRight of tab2..
1d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1d60: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
1d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1da0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1db0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1dd0: 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d  f tables in FROM
1de0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1df0: 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   iLeft,         
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e10: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  Index of first t
1e20: 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20  able to join in 
1e30: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
1e40: 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  olLeft,         
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1e60: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
1e70: 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  first table */. 
1e80: 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20   int iRight,    
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63   /* Index of sec
1eb0: 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72  ond table in pSr
1ec0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52  c */.  int iColR
1ed0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1ee0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ef0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63  of column in sec
1f00: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ond table */.  i
1f10: 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20  nt isOuterJoin, 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1f40: 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  s an OUTER join 
1f50: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  */.  Expr **ppWh
1f60: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
1f70: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1f80: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1f90: 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b   to add to */.){
1fa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1fb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
1fc0: 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72  xpr *pE1;.  Expr
1fd0: 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70   *pE2;.  Expr *p
1fe0: 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  Eq;..  assert( i
1ff0: 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20  Left<iRight );. 
2000: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
2010: 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20  Src>iRight );.  
2020: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
2030: 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20  iLeft].pTab );. 
2040: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
2050: 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b  [iRight].pTab );
2060: 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65  ..  pE1 = sqlite
2070: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2080: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66  r(db, pSrc, iLef
2090: 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20  t, iColLeft);.  
20a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE2 = sqlite3Cre
20b0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
20c0: 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20  , pSrc, iRight, 
20d0: 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70  iColRight);..  p
20e0: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
20f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c  r(pParse, TK_EQ,
2100: 20 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20   pE1, pE2, 0);. 
2110: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
2120: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2130: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2140: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2150: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2170: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2180: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2190: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
21a0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
21b0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
21c0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
21d0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
21e0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
21f0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2200: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
2210: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
2220: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2230: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2240: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2250: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2260: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2270: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2280: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2290: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
22a0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
22b0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
22c0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
22d0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
22e0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
22f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2300: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2310: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2320: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2330: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2340: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2350: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2360: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2370: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2380: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2390: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
23a0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
23b0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
23c0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
23d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
23e0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
23f0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2400: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2410: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2420: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2430: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2440: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2450: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2460: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2470: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2480: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2490: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
24a0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
24b0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
24c0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
24d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
24e0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
24f0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2500: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2510: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2520: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2530: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2540: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2550: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2560: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2570: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2580: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2590: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
25a0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
25b0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
25c0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
25d0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
25e0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
25f0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2600: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2610: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2620: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2630: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2640: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2650: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2660: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2670: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2680: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2690: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
26a0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
26b0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
26c0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
26d0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
26e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
26f0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2700: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2710: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2720: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2730: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2750: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2760: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2770: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2780: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2790: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
27a0: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
27b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
27c0: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
27d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
27e0: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
27f0: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2800: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2820: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2840: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2850: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
2860: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
2870: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
2880: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
2890: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
28a0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
28b0: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
28c0: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
28d0: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
28e0: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
28f0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
2900: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
2910: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2920: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2930: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2940: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2950: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
2960: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
2970: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
2980: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
2990: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
29a0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
29b0: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
29c0: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
29d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
29e0: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
29f0: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
2a00: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
2a10: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2a20: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2a30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2a40: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
2a50: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
2a60: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
2a70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2a90: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
2aa0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2ab0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
2ac0: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
2ad0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2ae0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2af0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
2b00: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
2b10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2b20: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2b30: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b50: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2b60: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2b70: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
2b80: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
2b90: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2ba0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2bb0: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
2bc0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
2bd0: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2be0: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
2bf0: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
2c00: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
2c10: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2c20: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2c30: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2c40: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
2c50: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
2c60: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
2c70: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
2c80: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
2c90: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
2ca0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
2cb0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
2cc0: 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52  LeftTab==0 || pR
2cd0: 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f  ightTab==0) ) co
2ce0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
2cf0: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
2d00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2d10: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
2d20: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2d30: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
2d40: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
2d50: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
2d60: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
2d70: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
2d80: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
2d90: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2da0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2db0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2dc0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2dd0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2de0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e10: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2e20: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2e30: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2e40: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2e50: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2e60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2e70: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2e80: 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e  0; j<pRightTab->
2e90: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2ea0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
2ec0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68  lumn in the righ
2ed0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
2ee0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
2ef0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65    /* Matching le
2f00: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ft table */.    
2f10: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
2f20: 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63  ;  /* Matching c
2f30: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66  olumn in the lef
2f40: 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  t table */..    
2f50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67      zName = pRig
2f60: 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  htTab->aCol[j].z
2f70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2f80: 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  ( tableAndColumn
2f90: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
2fa0: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
2fb0: 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20  &iLeftCol) ){.  
2fc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2fd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
2fe0: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
2ff0: 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20  ol, i+1, j,.    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
3020: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
3030: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3040: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
3050: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
3060: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
3070: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
3080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3090: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
30a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
30b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
30c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
30d0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
30e0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
30f0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
3100: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
3110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3130: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
3140: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
3150: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
3160: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
3170: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
3180: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
3190: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
31a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
31b0: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
31c0: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
31d0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
31e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
31f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
3200: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3210: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
3220: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
3230: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
3240: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3250: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
3260: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
3270: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
3280: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
3290: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
32a0: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
32b0: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
32c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
32d0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
32e0: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
32f0: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
3300: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
3310: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
3320: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
3330: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
3340: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
3350: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
3360: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
3370: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
3380: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
3390: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
33a0: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
33b0: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
33c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
33d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
33f0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
3400: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
3410: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
3420: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
3430: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
3440: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3450: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3460: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55  he term in the U
3470: 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  SING clause */. 
3480: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3490: 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ;       /* Table
34a0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74   on the left wit
34b0: 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  h matching colum
34c0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
34d0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
34e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
34f0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3500: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
3510: 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ft */.        in
3520: 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f  t iRightCol;   /
3530: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3540: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3550: 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  mn on the right 
3560: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
3570: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3590: 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d  RightCol = colum
35a0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
35b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35c0: 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c    if( iRightCol<
35d0: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74  0.         || !t
35e0: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
35f0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3600: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3610: 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  eftCol).        
3620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3630: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3640: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
3650: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
3660: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
3670: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
3680: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
3690: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
36a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
36c0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
36d0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
36e0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
36f0: 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c   i+1, iRightCol,
3700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3710: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
3720: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
3730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3740: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3750: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
3760: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
3770: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
3780: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
3790: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
37a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
37b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
37c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
37d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
37e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
37f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3800: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
3810: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
3820: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
3830: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
3840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
3850: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
3860: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
3870: 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20  gData           
3880: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
3890: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
38a0: 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56  sorted */.){.  V
38b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
38c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45  >pVdbe;.  int nE
38d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
38e0: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67  nExpr;.  int reg
38f0: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
3900: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
3910: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3920: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  nt regRecord = s
3930: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3940: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
3950: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  op;.  sqlite3Exp
3960: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
3970: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
3980: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
3990: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
39a0: 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
39b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
39c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
39d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
39e0: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
39f0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
3a00: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
3a10: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
3a20: 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29  Base+nExpr+1, 1)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
3a60: 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52   nExpr + 2, regR
3a70: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53  ecord);.  if( pS
3a80: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
3a90: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
3aa0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
3ab0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
3ac0: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
3ad0: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
3ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3af0: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4f 72 64 65  Op2(v, op, pOrde
3b00: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3b10: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3b20: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3b30: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
3b40: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3b50: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
3b60: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
3b70: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66  , nExpr+2);.  if
3b80: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
3b90: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
3ba0: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69  r1, addr2;.    i
3bb0: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
3bc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66  f( pSelect->iOff
3bd0: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  set ){.      iLi
3be0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
3bf0: 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65  Offset+1;.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  lse{.      iLimi
3c10: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  t = pSelect->iLi
3c20: 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mit;.    }.    a
3c30: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3c40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3c50: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  fZero, iLimit); 
3c60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
3c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3c80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3c90: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3ca0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
3cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
3cc0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
3cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3ce0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
3cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3d00: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
3d10: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3d20: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3d30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3d40: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
3d50: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3d70: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3d80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3d90: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3da0: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
3db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3dc0: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
3dd0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3de0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3df0: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
3e00: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
3e10: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
3e20: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
3e30: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
3e40: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3e50: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3e60: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3e70: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3e80: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
3e90: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3ea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3ed0: 64 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20 2d  dImm, iOffset, -
3ee0: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
3ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3f00: 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f  (v, OP_IfNeg, iO
3f10: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
3f20: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
3f30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3f40: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3f50: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
3f60: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
3f70: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
3f80: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
3f90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3fa0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
3fb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3fc0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
3fd0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
3fe0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
3ff0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
4000: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
4010: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
4020: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
4030: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
4040: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
4050: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
4060: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
4070: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
4080: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
4090: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
40a0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
40b0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
40c0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
40d0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
40e0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
40f0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
4100: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
4110: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
4120: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
4130: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
4140: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
4150: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
4160: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4170: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4180: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
4190: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
41a0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
41b0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
41c0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
41d0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
41e0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
41f0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
4200: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
4210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4220: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4230: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
4240: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4250: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
4260: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
4270: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
4280: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
4290: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
42a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
42b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
42c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
42d0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
42e0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
42f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
4300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4310: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4320: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
4330: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4340: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
4350: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
4360: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
4370: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4380: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
4390: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
43a0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
43b0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
43c0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
43d0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
43e0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
43f0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
4400: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
4410: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
4420: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
4430: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
4440: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
4450: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
4460: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
4470: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
4480: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
4490: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
44a0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
44b0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
44c0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
44d0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
44e0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
44f0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
4500: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
4510: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
4520: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
4530: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4540: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
4550: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
4560: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
4570: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
4580: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
4590: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
45a0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
45b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
45c0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
45d0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
45e0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
45f0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
4600: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
4610: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
4620: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
4630: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
4640: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4650: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
4660: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
4670: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
4680: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
4690: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
46a0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
46b0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
46c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
46d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
46e0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
46f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
4700: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
4710: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
4720: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
4730: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
4740: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4750: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
4760: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
4770: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
4780: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
4790: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
47a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
47b0: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
47c0: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
47d0: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
47e0: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
47f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
4800: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4810: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
4820: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
4830: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
4840: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
4850: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
4860: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
4870: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
4880: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
4890: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
48a0: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
48b0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
48c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
48d0: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
48e0: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
48f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
4900: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4910: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
4920: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4930: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
4940: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
4950: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
4960: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
4970: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
4980: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
4990: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
49a0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
49b0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
49c0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
49d0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
49e0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
49f0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
4a00: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
4a10: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
4a20: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
4a30: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
4a40: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
4a50: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
4a60: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
4a70: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4a80: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
4a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
4aa0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
4ab0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
4ac0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
4ad0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
4ae0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4af0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
4b00: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
4b10: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
4b20: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b40: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
4b50: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  his table */.  E
4b60: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4b70: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
4b80: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
4b90: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
4ba0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  ey */.  int nOBS
4bb0: 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  at,             
4bc0: 2f 2a 20 54 65 72 6d 73 20 6f 66 20 4f 52 44 45  /* Terms of ORDE
4bd0: 52 20 42 59 20 61 6c 72 65 61 64 79 20 73 61 74  R BY already sat
4be0: 69 73 66 69 65 64 20 2a 2f 0a 20 20 44 69 73 74  isfied */.  Dist
4bf0: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
4c00: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
4c10: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
4c20: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
4c30: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
4c40: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
4c50: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4c60: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
4c70: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
4c80: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
4c90: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
4ca0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
4cb0: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
4cc0: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
4cd0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4ce0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
4cf0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
4d00: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4d10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4d20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
4d30: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
4d40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4d50: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4d60: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
4d70: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
4d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4d90: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
4da0: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
4db0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
4dc0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
4dd0: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
4de0: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
4df0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
4e00: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
4e10: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
4e20: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
4e30: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
4e40: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
4e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4e60: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4e70: 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
4e80: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
4e90: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4ea0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4eb0: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
4ec0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
4ed0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
4ee0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 4f  T_NOOP;.  if( pO
4ef0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
4f00: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4f10: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4f20: 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
4f30: 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  inue);.  }..  /*
4f40: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
4f50: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
4f60: 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d  /.  nResultCol =
4f70: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
4f80: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  .  if( pDest->iS
4f90: 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  dst==0 ){.    pD
4fa0: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
4fb0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
4fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4fd0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
4fe0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
4ff0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
5000: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
5010: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
5020: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
5030: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
5040: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
5050: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
5060: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
5070: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
5080: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
5090: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
50a0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
50b0: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
50c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
50d0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
50e0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
50f0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
5100: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
5110: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
5120: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
5130: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
5140: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
5150: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
5160: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
5170: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
5180: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
5190: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
51a0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
51b0: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
51c0: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
51d0: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
51e0: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
51f0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
5200: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
5210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5230: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
5240: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
5250: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
5260: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
5270: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
5280: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
5290: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
52a0: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
52b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
52c0: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
52d0: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
52e0: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
52f0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
5300: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
5310: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
5320: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
5330: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5340: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
5350: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
5360: 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sult,.          
5370: 20 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d          (eDest==
5380: 53 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73  SRT_Output||eDes
5390: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
53a0: 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  )?SQLITE_ECEL_DU
53b0: 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  P:0);.  }..  /* 
53c0: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
53d0: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
53e0: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
53f0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
5400: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
5410: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
5420: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
5430: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
5440: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
5450: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
5460: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
5470: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
5480: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5490: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
54a0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
54b0: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
54c0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
54d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
54e0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
54f0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
5500: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
5510: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
5520: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5530: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
5540: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
5550: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
5560: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
5570: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
5580: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
5590: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
55a0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
55b0: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
55c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
55d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
55e0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
55f0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
5600: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
5610: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
5620: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
5630: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
5640: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
5650: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
5660: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
5670: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
5680: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
5690: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
56a0: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
56b0: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
56c0: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
56d0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
56e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
56f0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
5700: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
5710: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
5720: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5740: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5750: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5760: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
5770: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
5780: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
5790: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
57a0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
57b0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
57c0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
57d0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
57e0: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
57f0: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
5800: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5810: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
5820: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
5830: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
5840: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
5850: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5860: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
5870: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5880: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5890: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
58a0: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
58b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
58c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58d0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
58e0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
58f0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
5900: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
5910: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
5920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5940: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
5950: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
5960: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
5970: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
5980: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
59a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
59b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
59c0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
59d0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
59e0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
59f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5a00: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
5a10: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
5a20: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
5a30: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
5a40: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
5a50: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
5a60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a70: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
5a80: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
5a90: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20  nResultCol-1);. 
5aa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ab0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5ac0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5ad0: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5af0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5b00: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5b10: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5b20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
5b30: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5b40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
5b50: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5b60: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5b70: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5b80: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5b90: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5ba0: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5bb0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75  iContinue, nResu
5bc0: 6c 74 43 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74  ltCol, regResult
5bd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5bf0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
5c10: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5c20: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5c40: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
5c50: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
5c60: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
5c70: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
5c80: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
5c90: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
5ca0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5cb0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5cc0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
5cd0: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
5ce0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
5cf0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
5d00: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
5d10: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5d20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5d30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5d40: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5d50: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
5d60: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
5d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5d80: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
5d90: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
5da0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5db0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5dc0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
5dd0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5de0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
5df0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
5e00: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
5e10: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
5e20: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
5e30: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
5e40: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
5e50: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
5e60: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
5e70: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
5e80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5e90: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5eb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
5ec0: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
5ed0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
5ee0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
5ef0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5f00: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
5f10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
5f20: 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  /..    /* Store 
5f30: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5f40: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5f50: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5f60: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 54    case SRT_DistT
5f70: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5f80: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5f90: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5fa0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
5fb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5fc0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5fd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5fe0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
5ff0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6000: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
6010: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
6020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6030: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6040: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6050: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 23 69  sultCol, r1);.#i
6060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6070: 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20  T_CTE.      if( 
6080: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 54  eDest==SRT_DistT
6090: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
60a0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
60b0: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 54 61 62  ation is DistTab
60c0: 6c 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  le, then cursor 
60d0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
60e0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
60f0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
6100: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
6110: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
6120: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
6130: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
6140: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
6150: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
6160: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
6170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
6180: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
6190: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
61a0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
61b0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
61c0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
61d0: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
61e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
61f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6200: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
6210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6220: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6230: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
6240: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
6250: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6260: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6270: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6280: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6290: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
62a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
62b0: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
62c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
62d0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
62e0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
62f0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
6300: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
6310: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6320: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
6330: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6340: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
6350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6360: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6370: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
6380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6390: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
63a0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
63b0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
63c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
63d0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
63e0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
63f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
6400: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
6410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6420: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6430: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6440: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6450: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
6460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6470: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
6480: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
6490: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
64a0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
64b0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
64c0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
64d0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
64e0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
64f0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
6500: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
6510: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
6520: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
6530: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6540: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6550: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
6560: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
6570: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6590: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
65a0: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
65b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
65c0: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
65d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
65e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
65f0: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
6600: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
6610: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
6620: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
6630: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
6640: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
6650: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6660: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
6670: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
6680: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
6690: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
66a0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
66b0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
66c0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
66d0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
66e0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
66f0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
6700: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
6710: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6730: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6740: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6750: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
6760: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6770: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6780: 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20  regResult,1,r1, 
6790: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
67a0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
67b0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
67c0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
67d0: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
67f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6800: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
6810: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
6820: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6830: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6840: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
6850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6860: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
6870: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
6880: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
6890: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
68a0: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
68b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
68c0: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
68d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
68e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
68f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
6900: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
6910: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
6920: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
6930: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6950: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
6960: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
6970: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
6980: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
6990: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
69a0: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
69b0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
69c0: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
69d0: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
69e0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
69f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
6a00: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
6a10: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
6a20: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
6a30: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
6a40: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6a50: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6a60: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6a70: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6a80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6a90: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6aa0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6ab0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6ac0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6ad0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6ae0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
6af0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
6b00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6b10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
6b20: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
6b30: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
6b40: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
6b50: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
6b60: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
6b70: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
6b80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
6b90: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
6ba0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
6bb0: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
6bc0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6bd0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
6be0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
6bf0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6c00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
6c10: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6c20: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
6c30: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6c40: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
6c50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c60: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6c70: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6c80: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6c90: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
6ca0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
6cb0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
6cc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6cd0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6ce0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
6cf0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
6d00: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6d10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6d30: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6d40: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
6d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6d70: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6d80: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6d90: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
6da0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6db0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6dc0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6dd0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
6de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6df0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6e00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6e10: 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74  _CTE.    /* Writ
6e20: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
6e30: 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75  to a priority qu
6e40: 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65  eue that is orde
6e50: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20  r according to. 
6e60: 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72     ** pDest->pOr
6e70: 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20  derBy (in pSO). 
6e80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
6e90: 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68  (in iParm) is th
6ea0: 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a  e cursor for an.
6eb0: 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74      ** index wit
6ec0: 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63  h pSO->nExpr+2 c
6ed0: 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61  olumns.  Build a
6ee0: 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66   key using pSO f
6ef0: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
6f00: 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63   ** pSO->nExpr c
6f10: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b  olumns, then mak
6f20: 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20  e sure all keys 
6f30: 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64  are unique by ad
6f40: 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ding a.    ** fi
6f50: 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  nal OP_Sequence 
6f60: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73  column.  The las
6f70: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  t column is the 
6f80: 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62  record as a blob
6f90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6fa0: 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a  e SRT_DistQueue:
6fb0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75  .    case SRT_Qu
6fc0: 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  eue: {.      int
6fd0: 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74   nKey;.      int
6fe0: 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20   r1, r2, r3;.   
6ff0: 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20     int addrTest 
7000: 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
7010: 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20  ist *pSO;.      
7020: 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72  pSO = pDest->pOr
7030: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73  derBy;.      ass
7040: 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20  ert( pSO );.    
7050: 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45    nKey = pSO->nE
7060: 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  xpr;.      r1 = 
7070: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7080: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7090: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
70a0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
70b0: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
70c0: 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b   r3 = r2+nKey+1;
70d0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
70e0: 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
70f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
7100: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
7110: 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74   is DistQueue, t
7120: 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72  hen cursor (iPar
7130: 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20  m+1) is open.   
7140: 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63       ** on a sec
7150: 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ond ephemeral in
7160: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61  dex that holds a
7170: 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20  ll values every 
7180: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20  previously.     
7190: 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74     ** added to t
71a0: 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20  he queue. */.   
71b0: 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d 20       addrTest = 
71c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
71d0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
71e0: 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20  , iParm+1, 0, . 
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
7220: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7230: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
7240: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
7250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7260: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
7270: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7280: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7290: 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r3);.      if( 
72a0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
72b0: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
72c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
72d0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
72e0: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b  t, iParm+1, r3);
72f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7300: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7310: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
7320: 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SULT);.      }. 
7330: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7340: 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nKey; i++){.    
7350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7360: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
7370: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
7390: 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b  Result + pSO->a[
73a0: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
73b0: 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20  ol - 1,.        
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d    r2+i);.      }
73e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
73f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
7400: 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20  equence, iParm, 
7410: 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  r2+nKey);.      
7420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7430: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7440: 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20  rd, r2, nKey+2, 
7450: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
7460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7470: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7480: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
7490: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
74a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
74b0: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
74c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
74d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
74e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
74f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
7500: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7510: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
7520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7530: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7540: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
7550: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7560: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
7570: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
7580: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
7590: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
75a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
75b0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
75c0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
75d0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
75e0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
75f0: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
7600: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
7610: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
7620: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
7630: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
7640: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
7650: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
7660: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
7670: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
7680: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7690: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
76a0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
76b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
76c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
76d0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
76e0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
76f0: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
7700: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
7710: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
7720: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
7730: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
7740: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
7750: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
7760: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
7770: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
7780: 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  rBy==0 && p->iLi
7790: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
77a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
77b0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
77c0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
77d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
77e0: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
77f0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
7800: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
7810: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
7820: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
7830: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
7840: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
7850: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
7860: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
7870: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
7880: 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66  int X){.  KeyInf
7890: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
78a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20  MallocZero(0, . 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f    sizeof(KeyInfo
78d0: 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  ) + (N+X)*(sizeo
78e0: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
78f0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
7900: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
7910: 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e  (u8*)&p->aColl[N
7920: 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65  +X];.    p->nFie
7930: 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20  ld = (u16)N;.   
7940: 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75   p->nXField = (u
7950: 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  16)X;.    p->enc
7960: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
7970: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
7980: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d  p->nRef = 1;.  }
7990: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  else{.    db->ma
79a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
79b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
79c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
79d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
79e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
79f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7a00: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
7a10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
7a20: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
7a30: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
7a40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
7a50: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
7a60: 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ree(0, p);.  }.}
7a70: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e  ../*.** Make a n
7a80: 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ew pointer to a 
7a90: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
7aa0: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
7ab0: 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79  e3KeyInfoRef(Key
7ac0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
7ad0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
7ae0: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
7af0: 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d    p->nRef++;.  }
7b00: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
7b10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7b20: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
7b30: 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e   TRUE if a KeyIn
7b40: 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  fo object can be
7b50: 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65   change.  The Ke
7b60: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  yInfo object.** 
7b70: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e  can only be chan
7b80: 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a  ged if this is j
7b90: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66  ust a single ref
7ba0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62  erence to the ob
7bb0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
7bc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
7bd0: 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20   only inside of 
7be0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
7bf0: 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
7c00: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
7c10: 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70  eable(KeyInfo *p
7c20: 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  ){ return p->nRe
7c30: 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f  f==1; }.#endif /
7c40: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
7c50: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
7c60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
7c70: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
7c80: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
7c90: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
7ca0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
7cb0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
7cc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
7cd0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
7ce0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
7cf0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
7d00: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
7d10: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
7d20: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
7d30: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
7d40: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
7d50: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
7d60: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
7d70: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
7d80: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
7d90: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
7da0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
7db0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
7dc0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
7dd0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
7de0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
7df0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
7e00: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
7e10: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
7e20: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
7e30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
7e40: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
7e50: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
7e60: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
7e70: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
7e80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
7e90: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
7ea0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
7eb0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
7ec0: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
7ed0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
7ee0: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
7ef0: 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61  rList(Parse *pPa
7f00: 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
7f10: 4c 69 73 74 2c 20 69 6e 74 20 6e 45 78 74 72 61  List, int nExtra
7f20: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
7f30: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
7f40: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7f50: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7f70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7f80: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7f90: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7fa0: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7fb0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
7fc0: 20 6e 45 78 70 72 2b 6e 45 78 74 72 61 2c 20 31   nExpr+nExtra, 1
7fd0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
7fe0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
7ff0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
8000: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
8010: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
8020: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
8030: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
8040: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
8050: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8060: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8070: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
8080: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
8090: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
80a0: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
80b0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
80c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
80d0: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
80e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
80f0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
8100: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
8110: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8120: 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65  pInfo;.}..#ifnde
8130: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8140: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
8150: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
8160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
8170: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
8180: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
8190: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
81a0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
81b0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
81c0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
81d0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
81e0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
81f0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
8200: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8210: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
8220: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
8230: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8240: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
8250: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
8260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
8270: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
8280: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
8290: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
82a0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
82b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
82c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
82d0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
82e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
82f0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
8300: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
8310: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
8320: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
8330: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
8340: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
8350: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
8360: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
8370: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
8380: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
8390: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
83a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
83b0: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
83c0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
83d0: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
83e0: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
83f0: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
8400: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
8410: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
8420: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
8430: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
8440: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
8450: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
8460: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
8470: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
8480: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
8490: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
84a0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
84b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
84c0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
84d0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
84e0: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
84f0: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
8500: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
8510: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
8520: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8530: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
8540: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
8550: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
8560: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
8570: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
8580: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
8590: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
85a0: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
85b0: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
85c0: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
85d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
85e0: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
85f0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
8600: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
8610: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
8620: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
8630: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
8640: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
8650: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
8660: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8670: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
8680: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
8690: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
86a0: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
86b0: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
86c0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
86d0: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
86e0: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
86f0: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
8700: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
8710: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
8720: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
8730: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
8740: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
8750: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
8760: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
8770: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8780: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
8790: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
87a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
87b0: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
87c0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
87d0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
87e0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
87f0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
8800: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
8810: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
8820: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
8830: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
8840: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
8850: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
8860: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
8870: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
8880: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
8890: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
88a0: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
88b0: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
88c0: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
88d0: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
88e0: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
88f0: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
8900: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
8910: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
8920: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
8930: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
8940: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
8950: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
8960: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
8970: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
8980: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
8990: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
89a0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
89b0: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
89c0: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
89d0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
89e0: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
89f0: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
8a00: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
8a10: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
8a20: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
8a30: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
8a40: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
8a50: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
8a60: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
8a70: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
8a80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8a90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
8aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
8ab0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ad0: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
8ae0: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
8af0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
8b20: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
8b30: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8b50: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
8b60: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
8b90: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
8ba0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
8bb0: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
8bc0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
8bd0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
8be0: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
8bf0: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
8c00: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
8c10: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
8c20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8c30: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
8c40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
8c50: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8c60: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
8c70: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
8c80: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
8c90: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
8ca0: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
8cb0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
8cc0: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
8cd0: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
8ce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8cf0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
8d00: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
8d10: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
8d20: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
8d30: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
8d40: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
8d50: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
8d60: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
8d70: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
8d80: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
8d90: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
8da0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
8db0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
8dc0: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
8dd0: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
8de0: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
8df0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
8e00: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
8e10: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
8e20: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
8e30: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
8e40: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
8e50: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
8e60: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
8e70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
8e80: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
8e90: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
8ea0: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
8eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
8ec0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
8ed0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8ee0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8ef0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
8f00: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
8f10: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
8f20: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ment */.  int nC
8f30: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
8f40: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8f50: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
8f60: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
8f70: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
8f80: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
8f90: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8fc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
8fd0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8fe0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
8ff0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
9000: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
9010: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
9020: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
9030: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
9040: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
9050: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
9060: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
9070: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
9080: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
9090: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
90a0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
90b0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
90c0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
90d0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
90e0: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
90f0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
9100: 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  iSDParm;..  int 
9110: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
9120: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
9130: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
9140: 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d  rsor;.  regRow =
9150: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
9160: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
9170: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
9180: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
9190: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
91a0: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
91b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
91c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
91e0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
91f0: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
9200: 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  n);.    regRowid
9210: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
9220: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
9230: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
9240: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  pParse);.  }.  i
9250: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
9260: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
9270: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
9280: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
9290: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74  nMem;.    int pt
92a0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
92b0: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
92c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
92d0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74  P_OpenPseudo, pt
92e0: 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  ab2, regSortOut,
92f0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9300: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  +2);.    addr = 
9310: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
9320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
9330: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
9340: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
9350: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9360: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
9370: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
9380: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
9390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
93a0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
93b0: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
93c0: 74 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tOut);.    sqlit
93d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
93e0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32  OP_Column, ptab2
93f0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
9400: 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  r+1, regRow);.  
9410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9420: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
9430: 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d  CLEARCACHE);.  }
9440: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d  else{.    addr =
9450: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
9460: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
9470: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
9480: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9490: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
94a0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
94b0: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
94c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
94d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
94e0: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
94f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
9500: 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73  regRow);.  }.  s
9510: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
9520: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
9530: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
9540: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
9550: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9560: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
9570: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9580: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
9590: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
95a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
95b0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
95c0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
95d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
95e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
95f0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
9600: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
9610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9620: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
9630: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
9640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9650: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9660: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9670: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
9680: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
9690: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
96a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96b0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
96c0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
96d0: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20   1, regRowid,.  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66        &pDest->af
9700: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
9710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
9720: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
9730: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
9740: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9750: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9760: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
9770: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
9780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9790: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
97a0: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
97b0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
97c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
97d0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
97e0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
97f0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
9800: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
9810: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
9820: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
9830: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
9840: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9850: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
9860: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61    int i;.      a
9870: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
9880: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
9890: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
98a0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
98b0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
98c0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
98d0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
98e0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
98f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9900: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
9910: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9920: 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d  ( regRow!=pDest-
9930: 3e 69 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20  >iSdst+i );.    
9940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
9960: 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69  mn, pseudoTab, i
9970: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69  , pDest->iSdst+i
9980: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
9990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
99a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
99b0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
99c0: 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20  LEARCACHE);.    
99d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
99e0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
99f0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
9a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
9a20: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
9a30: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
9a40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9a50: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
9a60: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
9a70: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
9a80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
9a90: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
9ab0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
9ac0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
9ad0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9af0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9b00: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
9b10: 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  w);.  sqlite3Rel
9b20: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
9b30: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  se, regRowid);..
9b40: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
9b50: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
9b60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
9b70: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
9b80: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69  drContinue);.  i
9b90: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
9ba0: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
9bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9bc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
9bd0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
9be0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
9bf0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
9c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
9c20: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
9c30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9c40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
9c50: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9c60: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
9c70: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
9c80: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
9c90: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
9ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9cb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
9cc0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
9cd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
9ce0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9cf0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
9d00: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
9d10: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
9d20: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
9d30: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
9d40: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
9d50: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
9d60: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
9d70: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
9d80: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
9d90: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
9da0: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
9db0: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
9dc0: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
9dd0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
9de0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
9df0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
9e00: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
9e10: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
9e20: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
9e30: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9e40: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
9e50: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
9e60: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
9e70: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
9e80: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
9e90: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
9ea0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
9eb0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
9ec0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
9ed0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
9ee0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
9ef0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
9f00: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
9f10: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
9f20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
9f30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
9f40: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
9f50: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
9f60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
9f70: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
9f80: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
9f90: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
9fa0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
9fb0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
9fc0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
9fd0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
9fe0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
9ff0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
a000: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
a010: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
a020: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
a030: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
a040: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
a050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a060: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
a070: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
a080: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
a090: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
a0a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
a0b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
a0c0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
a0d0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
a0e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a0f0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
a100: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
a110: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
a120: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
a130: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Impl(A,B,C,D,E,F
a140: 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
a150: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
a160: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
a170: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
a180: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
a190: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
a1a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
a1b0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
a1c0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
a1d0: 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74  gCol,.  u8 *pEst
a1e0: 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20  Width.){.  char 
a1f0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
a200: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
a210: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
a220: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
a230: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73  rigCol = 0;.#els
a240: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
a250: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
a260: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
a270: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
a280: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
a290: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
a2a0: 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63  pl(A,B,F).static
a2b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
a2c0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
a2d0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
a2e0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
a2f0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
a300: 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .){.#endif /* !d
a310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
a320: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
a330: 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20  DATA) */.  char 
a340: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
a350: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20  ;.  int j;.  u8 
a360: 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20  estWidth = 1;.. 
a370: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
a380: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
a390: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
a3a0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
a3b0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a3c0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
a3d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
a3e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
a3f0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
a400: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
a410: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
a420: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
a430: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
a440: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
a450: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
a460: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
a470: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
a480: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
a490: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
a4a0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
a4b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a4c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
a4d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
a4e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
a4f0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
a500: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
a510: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
a520: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
a530: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
a540: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
a550: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
a560: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
a570: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
a580: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
a590: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
a5a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
a5b0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
a5c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
a5d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
a5e0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
a5f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
a600: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a610: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
a620: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
a630: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
a640: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
a650: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
a660: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
a670: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
a680: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
a690: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
a6a0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
a6b0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
a6c0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
a6d0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
a6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
a700: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
a710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
a720: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
a730: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
a740: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
a750: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
a760: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
a770: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
a780: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
a790: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
a7a0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
a7b0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
a7c0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
a7d0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
a7e0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
a7f0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
a800: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
a810: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
a820: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
a830: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
a840: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
a850: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
a860: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
a870: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
a880: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
a890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a8a0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
a8b0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
a8c0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
a8d0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
a8e0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a8f0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
a900: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
a910: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
a920: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
a930: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
a940: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
a950: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
a960: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
a970: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
a980: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
a990: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
a9a0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
a9b0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
a9c0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
a9d0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
a9e0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
a9f0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
aa00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
aa10: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
aa20: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
aa30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
aa40: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
aa50: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
aa60: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
aa70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
aa80: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
aa90: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
aaa0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
aab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aac0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
aad0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
aae0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
aaf0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
ab00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
ab10: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
ab20: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
ab30: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
ab40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
ab50: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
ab60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
ab70: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
ab80: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
ab90: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
aba0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
abb0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
abc0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
abd0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
abe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
abf0: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
ac00: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
ac10: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
ac20: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
ac30: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
ac40: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
ac50: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
ac60: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
ac70: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
ac80: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
ac90: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
aca0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
acb0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
acc0: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
acd0: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
ace0: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
acf0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ad00: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
ad10: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
ad20: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
ad30: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
ad40: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
ad50: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
ad60: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
ad70: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
ad80: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
ad90: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
ada0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
adb0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
adc0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
add0: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
ade0: 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74  ,&zOrigCol, &est
adf0: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20  Width); .       
ae00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
ae10: 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  f( pTab->pSchema
ae20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
ae30: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
ae40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
ae50: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
ae60: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ae70: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ae80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
ae90: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
aea0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
aeb0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65  ->nCol) );.#ifde
aec0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
aed0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
aee0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
aef0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
af00: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
af10: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
af20: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
af30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
af40: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
af50: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
af60: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
af70: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
af80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
af90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
afa0: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
afb0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
afc0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
afd0: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
afe0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
aff0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
b000: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
b010: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
b020: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
b030: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
b040: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
b050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
b060: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
b070: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
b080: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
b090: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
b0a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
b0b0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
b0c0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
b0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b0e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
b0f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
b100: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  pe;.          es
b110: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
b120: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
b130: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
b140: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
b150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b160: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b170: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
b180: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
b190: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b1a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
b1b0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
b1c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
b1d0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
b1e0: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
b1f0: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
b200: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
b210: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
b220: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
b230: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
b240: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
b250: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
b260: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
b270: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
b280: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
b290: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
b2a0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
b2b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
b2c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
b2d0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
b2e0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
b2f0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
b300: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
b310: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
b320: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
b330: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
b340: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
b350: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
b360: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
b370: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
b380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
b3a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b3b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b3c0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
b3d0: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
b3e0: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
b3f0: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
b400: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
b410: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
b420: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
b430: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
b440: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
b450: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
b460: 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57  stWidth ) *pEstW
b470: 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b  idth = estWidth;
b480: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
b490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b4a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
b4b0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
b4c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
b4d0: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
b4e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
b4f0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
b500: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
b510: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
b520: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b530: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
b540: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
b550: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
b560: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
b570: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
b580: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
b590: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
b5a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
b5b0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
b5c0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
b5d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
b5e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
b5f0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
b600: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
b610: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
b620: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
b630: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
b640: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
b650: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
b660: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
b670: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
b680: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
b690: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
b6a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b6b0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
b6c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
b6d0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
b6e0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
b6f0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
b700: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
b710: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
b720: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
b730: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
b740: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
b750: 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  l, 0);..    /* T
b760: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
b770: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
b780: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
b790: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
b7a0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
b7b0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
b7c0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
b7d0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
b7e0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
b7f0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
b800: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
b810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b820: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b830: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
b840: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
b850: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
b860: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
b870: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
b880: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
b890: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
b8a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
b8b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
b8c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
b8d0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
b8e0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
b8f0: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
b900: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
b910: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
b920: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
b930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
b940: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
b950: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
b960: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
b970: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
b980: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b990: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
b9a0: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f  ECLTYPE) */.}../
b9b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
b9c0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
b9d0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
b9e0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
b9f0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ba00: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
ba10: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
ba20: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
ba30: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
ba40: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
ba50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba60: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ba70: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
ba80: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ba90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
baa0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
bab0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
bac0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
bad0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
bae0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
baf0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
bb00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
bb10: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
bb20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
bb30: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
bb40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bb50: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
bb60: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
bb70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bb80: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
bb90: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
bba0: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
bbb0: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
bbc0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
bbd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
bbe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
bbf0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
bc00: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
bc10: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
bc20: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
bc30: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
bc40: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
bc50: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
bc60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
bc70: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
bc80: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
bc90: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
bca0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
bcb0: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
bcc0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
bcd0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
bce0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
bcf0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
bd00: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
bd10: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
bd20: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
bd30: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
bd40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bd50: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
bd60: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
bd70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
bd80: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
bd90: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
bda0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
bdb0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
bdc0: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
bdd0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
bde0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
bdf0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
be00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
be10: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
be20: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
be30: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
be40: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
be50: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
be60: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
be70: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
be80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
be90: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
bea0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
beb0: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
bec0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
bed0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
bee0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
bef0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
bf00: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
bf10: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
bf20: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
bf30: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
bf40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
bf50: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
bf60: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
bf70: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
bf80: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
bf90: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
bfa0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
bfb0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
bfc0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
bfd0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
bfe0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
bff0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
c000: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
c010: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c020: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
c030: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
c040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
c050: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
c060: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
c070: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
c080: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c090: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
c0a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
c0b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
c0c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
c0d0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
c0e0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
c0f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
c100: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
c110: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
c120: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
c130: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
c140: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c160: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
c170: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
c180: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
c190: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
c1a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c1b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c1c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
c1d0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d  zSpan;.      z =
c1e0: 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d   z==0 ? sqlite3M
c1f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
c200: 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71  mn%d", i+1) : sq
c210: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c220: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
c230: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
c240: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
c250: 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  NAME, z, SQLITE_
c260: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
c270: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
c280: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
c290: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
c2a0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
c2b0: 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73  ven a an express
c2c0: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
c2d0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
c2e0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
c2f0: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
c300: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
c310: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
c320: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
c330: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
c340: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
c350: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
c360: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
c370: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
c380: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
c390: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
c3a0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
c3b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
c3c0: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
c3d0: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
c3e0: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
c3f0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
c400: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
c410: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
c420: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
c430: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
c440: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
c450: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
c460: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
c470: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
c480: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
c490: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
c4a0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
c4b0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
c4c0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
c4d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
c4e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c4f0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c500: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
c510: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
c520: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
c530: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
c540: 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
c550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
c560: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
c570: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
c580: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
c590: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
c5a0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
c5b0: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
c5c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
c5d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
c5e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c5f0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
c600: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
c610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c620: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c630: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
c640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c650: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
c660: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
c670: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
c680: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
c690: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
c6a0: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
c6b0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
c6c0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
c6d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c6e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c6f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c700: 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20  /.  Expr *p;    
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
c730: 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  r a single resul
c740: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
c750: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
c760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
c770: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
c780: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
c790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c7a0: 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
c7b0: 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70  me[] */..  if( p
c7c0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
c7d0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
c7e0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
c7f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c800: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
c810: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
c820: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
c830: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
c840: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
c850: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
c860: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
c870: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
c880: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
c890: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
c8a0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c8b0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
c8c0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
c8d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
c8e0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
c8f0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c900: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
c910: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28  Expr);.    if( (
c920: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
c930: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
c940: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
c950: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
c960: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
c970: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
c980: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
c990: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
c9a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c9b0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
c9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
c9d0: 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70  pr *pColExpr = p
c9e0: 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  ;  /* The expres
c9f0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  sion that is the
ca00: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
ca10: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
ca20: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
ca30: 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63    /* Table assoc
ca40: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
ca50: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
ca60: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
ca70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
ca80: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
ca90: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
caa0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
cab0: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
cac0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
cad0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
cae0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
caf0: 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45   && ALWAYS(pColE
cb00: 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  xpr->pTab!=0) ){
cb10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
cb20: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
cb30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
cb40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
cb50: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
cb60: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
cb70: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
cb80: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
cb90: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
cba0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
cbb0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
cbc0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cbd0: 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20  (db, "%s",.     
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
cbf0: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
cc00: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
cc10: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
cc20: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
cc30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
cc40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cc50: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
cc60: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
cc70: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
cc80: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
cc90: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
cca0: 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  s", pColExpr->u.
ccb0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
ccc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
ccd0: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
cce0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
ccf0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
cd00: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
cd10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
cd20: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
cd30: 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e  , "%s", pEList->
cd40: 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
cd50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
cd60: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
cd70: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
cd80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cd90: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
cda0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
cdb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
cdc0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
cdd0: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
cde0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
cdf0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
ce00: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
ce10: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
ce20: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
ce30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
ce40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ce50: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
ce60: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
ce70: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
ce80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ce90: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
cea0: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
ceb0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
cec0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
ced0: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
cee0: 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20  (k=nName-1; k>1 
cef0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
cf00: 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d  t(zName[k]); k--
cf10: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
cf20: 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d  k>=0 && zName[k]
cf30: 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20  ==':' ) nName = 
cf40: 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  k;.        zName
cf50: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
cf60: 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20       zNewName = 
cf70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
cf80: 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%s:%d", zNam
cf90: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
cfa0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cfb0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
cfc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65       zName = zNe
cfd0: 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a  wName;.        j
cfe0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
cff0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
d000: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d010: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
d020: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  me = zName;.  }.
d030: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d040: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
d050: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
d060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
d070: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
d080: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
d090: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d0a0: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
d0b0: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
d0c0: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
d0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d0e0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
d0f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d100: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
d110: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
d120: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
d130: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
d140: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
d150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
d160: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
d170: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
d180: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
d190: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
d1a0: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
d1b0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
d1c0: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
d1d0: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
d1e0: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
d1f0: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
d200: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
d210: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
d220: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
d230: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
d240: 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
d250: 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
d260: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
d270: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
d280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
d290: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
d2a0: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
d2b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d2c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d2d0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
d2e0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
d2f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
d300: 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
d310: 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
d320: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d330: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
d340: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
d350: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
d360: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
d370: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
d380: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d390: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d3a0: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
d3b0: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
d3c0: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
d3d0: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
d3e0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d3f0: 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20  *a;.  u64 szAll 
d400: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d410: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
d420: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
d430: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
d440: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
d450: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
d460: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
d470: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
d480: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d490: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
d4a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
d4b0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
d4c0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
d4d0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
d4e0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
d4f0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
d500: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
d510: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
d520: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
d530: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
d540: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
d550: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
d560: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
d570: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d580: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d590: 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c  , p,0,0,0, &pCol
d5a0: 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73  ->szEst));.    s
d5b0: 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a  zAll += pCol->sz
d5c0: 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  Est;.    pCol->a
d5d0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
d5e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
d5f0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
d600: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
d610: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
d620: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
d630: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d640: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d650: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
d660: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
d670: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
d680: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d690: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
d6a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
d6b0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
d6c0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
d6d0: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
d6e0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
d6f0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
d700: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
d710: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
d720: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
d730: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
d740: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
d750: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
d760: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
d770: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
d780: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
d790: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
d7a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d7b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
d7c0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
d7d0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
d7e0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
d7f0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
d800: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
d810: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
d820: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
d830: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
d840: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
d850: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
d860: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
d870: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
d880: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
d890: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
d8a0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
d8b0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
d8c0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
d8d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
d8e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
d8f0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
d900: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
d910: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
d920: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
d930: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
d940: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
d950: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
d960: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
d970: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
d980: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
d990: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
d9a0: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
d9b0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
d9c0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
d9d0: 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b  owEst = 1048576;
d9e0: 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73  .  selectColumns
d9f0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
da00: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45  rse, pSelect->pE
da10: 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
da20: 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
da30: 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  .  selectAddColu
da40: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
da50: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
da60: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61   pSelect);.  pTa
da70: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
da80: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
da90: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
daa0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
dab0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72  db, pTab);.    r
dac0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
dad0: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
dae0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
daf0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
db00: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
db10: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
db20: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
db30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
db40: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
db50: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
db60: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
db70: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
db80: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
db90: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
dba0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dbb0: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
dbc0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
dbd0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
dbe0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
dbf0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20  e);.    if( v ) 
dc00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc10: 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20  0(v, OP_Init);. 
dc20: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
dc30: 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20  Toplevel==0.    
dc40: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
dc50: 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
dc60: 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
dc70: 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b  OutConst).    ){
dc80: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  .      pParse->o
dc90: 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
dca0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72  ;.    }..  }.  r
dcb0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
dcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
dcd0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
dce0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
dcf0: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
dd00: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
dd10: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
dd20: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
dd30: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
dd40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
dd50: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
dd60: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
dd70: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
dd80: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
dd90: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
dda0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
ddb0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
ddc0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
ddd0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
dde0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
ddf0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
de00: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
de10: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
de20: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
de30: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
de40: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
de50: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
de60: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
de70: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
de80: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
de90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
dea0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
deb0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
dec0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
ded0: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
dee0: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
def0: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
df00: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
df10: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
df20: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
df30: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
df40: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
df50: 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
df60: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
df70: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
df80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
df90: 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
dfa0: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
dfb0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
dfc0: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
dfd0: 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
dfe0: 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
dff0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
e000: 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
e010: 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
e020: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
e030: 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
e040: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
e050: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
e060: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
e070: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
e080: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
e090: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
e0a0: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
e0b0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
e0c0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
e0d0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
e0e0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
e0f0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
e100: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
e110: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
e120: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
e130: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
e140: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e150: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e160: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
e170: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
e180: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
e190: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
e1a0: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
e1b0: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
e1c0: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
e1d0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
e1e0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
e1f0: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
e200: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
e210: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
e220: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
e230: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
e240: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
e250: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
e260: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
e270: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
e280: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
e290: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
e2a0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
e2b0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
e2c0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
e2d0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
e2e0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
e2f0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
e300: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e310: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
e320: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e330: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e340: 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
e350: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
e360: 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
e370: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
e380: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e390: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
e3a0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e3b0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e3c0: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
e3d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
e3e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
e3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e400: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
e410: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
e420: 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
e430: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36  ->nSelectRow>(u6
e440: 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  4)n ){.        p
e450: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
e460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e470: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e480: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e490: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
e4a0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
e4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e4c0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e4d0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
e4e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
e4f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e500: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
e510: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e530: 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  _IfZero, iLimit,
e540: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
e550: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
e560: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
e570: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
e580: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
e590: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e5a0: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
e5b0: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
e5c0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
e5d0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
e5e0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
e5f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e600: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e610: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
e620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e630: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e640: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
e650: 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
e660: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
e670: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
e680: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
e690: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
e6a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e6b0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
e6c0: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
e6d0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
e6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e6f0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e700: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e720: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
e730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e740: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
e750: 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  dd, iLimit, iOff
e760: 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b  set, iOffset+1);
e770: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
e780: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
e790: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61  FSET"));.      a
e7a0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
e7b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
e7c0: 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56  fPos, iLimit); V
e7d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e7f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e800: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
e810: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
e820: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e830: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
e840: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
e850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e860: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
e870: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
e880: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
e890: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
e8a0: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
e8b0: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
e8c0: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
e8d0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
e8e0: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
e8f0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
e900: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
e910: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
e920: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
e930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
e940: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
e950: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
e960: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
e970: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
e980: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
e990: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
e9a0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e9b0: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
e9c0: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
e9d0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
e9e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
e9f0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
ea00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
ea10: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
ea20: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
ea30: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
ea40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
ea50: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
ea60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
ea70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
ea80: 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
ea90: 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69  if( pRet==0 && i
eaa0: 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
eab0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74  Expr ){.    pRet
eac0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ead0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
eae0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
eaf0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
eb00: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
eb10: 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
eb20: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
eb30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
eb40: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
eb50: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
eb60: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
eb70: 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
eb80: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
eb90: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
eba0: 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
ebb0: 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
ebc0: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
ebd0: 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
ebe0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
ebf0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
ec00: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
ec10: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
ec20: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
ec30: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
ec40: 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
ec50: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
ec60: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
ec70: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
ec80: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
ec90: 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
eca0: 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
ecb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
ecc0: 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
ecd0: 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
ece0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
ecf0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
ed00: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
ed10: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
ed20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ed30: 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
ed40: 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
ed50: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
ed60: 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
ed70: 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
ed80: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
ed90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
eda0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
edb0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
edc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
edd0: 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
ede0: 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
edf0: 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
ee00: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
ee10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
ee20: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
ee30: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
ee40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
ee50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
ee60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ee70: 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
ee80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
ee90: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
eea0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eeb0: 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
eec0: 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
eed0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
eee0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
eef0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
ef00: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
ef10: 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
ef20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ef30: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
ef40: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
ef50: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ef60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
ef70: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
ef80: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
ef90: 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
efa0: 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
efb0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
efc0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
efd0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
efe0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
eff0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
f000: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
f010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
f020: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f030: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
f040: 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
f050: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
f060: 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
f070: 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
f080: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
f090: 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
f0a0: 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
f0b0: 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
f0c0: 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
f0d0: 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
f0f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
f100: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
f110: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
f140: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
f150: 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
f160: 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
f170: 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
f180: 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
f190: 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
f1a0: 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
f1b0: 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
f1c0: 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
f1d0: 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69  e SrcList->a[].i
f1e0: 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e  sRecursive flag.
f1f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70  .**.** The setup
f200: 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65  -query runs once
f210: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
f220: 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72  initial set of r
f230: 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69  ows that go.** i
f240: 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c  nto a Queue tabl
f250: 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74  e.  Rows are ext
f260: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
f270: 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20  Queue table one 
f280: 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68  by.** one.  Each
f290: 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66   row extracted f
f2a0: 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74  rom Queue is out
f2b0: 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  put to pDest.  T
f2c0: 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a  hen the single.*
f2d0: 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20  * extracted row 
f2e0: 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72  (now in the iCur
f2f0: 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f  rent table) beco
f300: 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  mes the content 
f310: 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73  of the.** recurs
f320: 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20  ive-table for a 
f330: 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20  recursive-query 
f340: 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74  run.  The output
f350: 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
f360: 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64  e-query.** is ad
f370: 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ded back into th
f380: 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
f390: 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77  Then another row
f3a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
f3b0: 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20  om Queue.** and 
f3c0: 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f  the iteration co
f3d0: 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68  ntinues until th
f3e0: 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
f3f0: 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
f400: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
f410: 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ery operator is 
f420: 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75  UNION then no du
f430: 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
f440: 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65   ever.** inserte
f450: 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  d into the Queue
f460: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69   table.  The iDi
f470: 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65  stinct table kee
f480: 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c  ps a copy of all
f490: 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61   rows.** that ha
f4a0: 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73  ve ever been ins
f4b0: 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65  erted into Queue
f4c0: 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c   and causes dupl
f4d0: 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20  icates to be.** 
f4e0: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74  discarded.  If t
f4f0: 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  he operator is U
f500: 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64  NION ALL, then d
f510: 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c  uplicates are al
f520: 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  lowed..** .** If
f530: 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61   the query has a
f540: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e  n ORDER BY, then
f550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
f560: 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20  Queue table are 
f570: 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  kept in.** ORDER
f580: 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68   BY order and th
f590: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73  e first entry is
f5a0: 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65   extracted for e
f5b0: 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68  ach cycle.  With
f5c0: 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20  out.** an ORDER 
f5d0: 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61  BY, the Queue ta
f5e0: 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49  ble is just a FI
f5f0: 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c  FO..**.** If a L
f600: 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70  IMIT clause is p
f610: 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68  rovided, then th
f620: 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70  e iteration stop
f630: 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f  s after LIMIT ro
f640: 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  ws.** have been 
f650: 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
f660: 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72    A LIMIT of zer
f670: 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  o means to outpu
f680: 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a  t no rows and a.
f690: 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49  ** negative LIMI
f6a0: 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  T means to outpu
f6b0: 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20  t all rows.  If 
f6c0: 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e  there is also an
f6d0: 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a   OFFSET clause.*
f6e0: 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76  * with a positiv
f6f0: 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  e value, then th
f700: 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f  e first OFFSET o
f710: 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61  utputs are disca
f720: 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74  rded rather.** t
f730: 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74  han being sent t
f740: 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49  o pDest.  The LI
f750: 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e  MIT count does n
f760: 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61  ot begin until a
f770: 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72  fter OFFSET.** r
f780: 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b  ows have been sk
f790: 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
f7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69   void generateWi
f7b0: 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
f7c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f7d0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
f7e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f7f0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
f800: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
f810: 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
f820: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
f830: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
f840: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
f850: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
f860: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
f870: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
f880: 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  p->pSrc;      /*
f890: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f8a0: 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
f8b0: 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  e query */.  int
f8c0: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
f8d0: 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75  t->nExpr;  /* Nu
f8e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f8f0: 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
f900: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65   table */.  Vdbe
f910: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f920: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
f930: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
f940: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
f950: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  uction */.  Sele
f960: 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e  ct *pSetup = p->
f970: 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65  pPrior;   /* The
f980: 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a   setup query */.
f990: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
f9c0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
f9d0: 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b  Cont, addrBreak;
f9e0: 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55        /* CONTINU
f9f0: 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72  E and BREAK addr
fa00: 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  esses */.  int i
fa10: 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
fa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fa30: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
fa40: 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e  .  int regCurren
fa50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
fa60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
fa70: 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62  ding Current tab
fa80: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65  le */.  int iQue
fa90: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
faa0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65        /* The Que
fab0: 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
fac0: 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  t iDistinct = 0;
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fae0: 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20  o ensure unique 
faf0: 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e  results if UNION
fb00: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
fb10: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
fb20: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72      /* How to wr
fb30: 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a  ite to Queue */.
fb40: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
fb50: 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  tQueue;         
fb60: 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61  /* SelectDest ta
fb70: 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65  rgetting the Que
fb80: 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
fb90: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fbb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
fbc0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fbe0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
fbf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
fc00: 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
fc10: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
fc20: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
fc30: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
fc40: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  set;       /* Sa
fc50: 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  ved LIMIT and OF
fc60: 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65  FSET */.  int re
fc70: 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65  gLimit, regOffse
fc80: 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t;      /* Regis
fc90: 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d  ters used by LIM
fca0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
fcb0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75  ..  /* Obtain au
fcc0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64  thorization to d
fcd0: 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  o a recursive qu
fce0: 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ery */.  if( sql
fcf0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
fd00: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43  arse, SQLITE_REC
fd10: 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29  URSIVE, 0, 0, 0)
fd20: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
fd30: 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d   Process the LIM
fd40: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
fd50: 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65  auses, if they e
fd60: 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72  xist */.  addrBr
fd70: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
fd80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
fd90: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
fda0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
fdb0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
fdc0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
fdd0: 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
fde0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
fdf0: 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
fe00: 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
fe10: 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
fe20: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
fe30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
fe40: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
fe50: 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
fe60: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
fe70: 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
fe80: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
fe90: 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
fea0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
feb0: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
fec0: 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
fed0: 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
fee0: 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65  a[i].isRecursive
fef0: 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
ff00: 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
ff10: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
ff20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ff30: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
ff40: 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
ff50: 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
ff60: 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
ff70: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
ff80: 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
ff90: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
ffa0: 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
ffb0: 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
ffc0: 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
ffd0: 68 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  he SRT_DistTable
ffe0: 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
fff0: 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
10000 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
10010 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
10020 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
10030 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
10040 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
10050 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
10060 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 54  ueue : SRT_DistT
10070 61 62 6c 65 3b 0a 20 20 20 20 69 44 69 73 74 69  able;.    iDisti
10080 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
10090 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
100a0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
100b0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
100c0 3a 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  : SRT_Table;.  }
100d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
100e0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
100f0 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
10100 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
10110 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
10120 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
10130 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
10140 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
10150 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10170 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
10180 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
10190 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
101a0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
101b0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
101c0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
101d0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
101e0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
101f0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
10200 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10210 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10220 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
10230 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
10260 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
10270 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
10280 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
10290 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
102a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
102c0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
102d0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
102e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
102f0 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
10300 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
10310 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
10320 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
10330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10340 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10350 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
10360 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
10370 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
10380 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
10390 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
103a0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
103b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
103c0 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
103d0 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
103e0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
103f0 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
10400 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
10410 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
10420 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
10430 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10440 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
10450 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
10460 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
10470 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
10480 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
10490 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
104a0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
104b0 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
104c0 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
104d0 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
104e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
104f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10500 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
10510 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10520 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
10530 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
10540 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
10550 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
10560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10570 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
10580 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
10590 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
105a0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
105b0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
105c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
105d0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
105e0 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
105f0 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
10600 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
10610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10620 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
10630 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
10640 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
10650 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10660 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
10670 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
10680 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
10690 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
106a0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
106b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
106c0 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
106d0 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
106e0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
106f0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
10700 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
10710 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
10720 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 70 44 65      0, 0, 0, pDe
10730 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
10740 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
10750 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
10760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10770 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  3(v, OP_IfZero, 
10780 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
10790 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64  eak, -1);.    Vd
107a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
107b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
107c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
107d0 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a  addrCont);..  /*
107e0 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63   Execute the rec
107f0 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61  ursive SELECT ta
10800 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20  king the single 
10810 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61  row in Current a
10820 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  s.  ** the value
10830 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   for the recursi
10840 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20  ve-table. Store 
10850 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
10860 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20  he Queue..  */. 
10870 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
10880 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
10890 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
108a0 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74  Queue);.  assert
108b0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
108c0 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
108d0 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65  pSetup;..  /* Ke
108e0 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c  ep running the l
108f0 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75  oop until the Qu
10900 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  eue is empty */.
10910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10920 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
10930 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  0, addrTop);.  s
10940 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10950 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
10960 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65  eak);..end_of_re
10970 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20  cursive_query:. 
10980 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
10990 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c  OrderBy;.  p->pL
109a0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
109b0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
109c0 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b  ffset;.  return;
109d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
109e0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
109f0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
10a00 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
10a10 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
10a20 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
10a30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10a40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10a50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10a60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10a70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
10a80 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
10a90 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10aa0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10ab0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
10ac0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
10ad0 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a  lts */.);.../*.*
10ae0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10af0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
10b00 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
10b10 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
10b20 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
10b30 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
10b40 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
10b50 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
10b60 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
10b70 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
10b80 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
10b90 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
10ba0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
10bb0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
10bc0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
10bd0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
10be0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
10bf0 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
10c00 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
10c10 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
10c20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
10c30 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
10c40 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
10c50 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
10c60 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
10c70 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
10c80 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
10c90 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
10ca0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
10cb0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
10cc0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
10cd0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
10ce0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
10cf0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
10d00 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
10d10 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
10d20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
10d30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
10d40 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
10d50 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
10d60 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
10d70 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
10d80 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
10d90 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
10da0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
10db0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
10dd0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
10de0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
10df0 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
10e00 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
10e10 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
10e20 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
10e30 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
10e40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10e50 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
10e60 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
10e70 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
10e80 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
10e90 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
10ea0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
10eb0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
10ec0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
10ed0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
10ee0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
10ef0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
10f00 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
10f10 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
10f20 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
10f30 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
10f40 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
10f50 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
10f60 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10f70 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10f80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
10f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10fa0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
10fb0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
10fc0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
10fd0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
10fe0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
10ff0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
11000 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
11020 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
11030 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
11040 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
11050 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
11060 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
11070 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
11080 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
11090 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
110a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
110b0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
110c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
110d0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
110e0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
110f0 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
11100 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
11110 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
11120 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
11130 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
11140 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
11150 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
11170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11180 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
11190 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
111a0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
111b0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
111c0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
111d0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
111e0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
111f0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
11200 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
11210 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
11220 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
11230 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
11240 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
11250 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
11260 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
11270 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
11280 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
11290 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
112a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
112b0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
112c0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
112d0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
112e0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
112f0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
11300 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
11310 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
11320 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
11330 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
11340 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11350 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
11360 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
11370 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
11380 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
11390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
113a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
113b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
113c0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
113d0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
113e0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
113f0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11400 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
11410 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
11420 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
11430 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
11440 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11450 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
11460 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
11470 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
11480 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
11490 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
114a0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
114b0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
114c0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
114d0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
114e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
114f0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
11500 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
11510 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
11520 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
11530 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
11540 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
11550 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
11560 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
11570 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
11580 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
11590 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
115a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
115b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
115c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
115d0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
115e0 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
115f0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
11600 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11610 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
11620 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
11630 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
11640 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
11650 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
11660 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
11670 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
11680 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
11690 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
116a0 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
116b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
116c0 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
116d0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
116e0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
116f0 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
11700 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
11710 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
11720 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
11730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11750 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
11760 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
11770 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
11780 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
11790 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
117a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
117b0 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
117c0 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
117d0 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20  s".        " do 
117e0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
117f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
11800 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
11810 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
11820 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
11830 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
11840 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
11850 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
11860 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
11870 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
11880 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
11890 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
118a0 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
118b0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
118c0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
118d0 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
118e0 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
118f0 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
11900 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
11910 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
11920 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
11930 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
11940 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
11950 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
11960 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
11970 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11980 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
11990 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
119a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
119b0 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
119c0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
119d0 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
119e0 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
119f0 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
11a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11a10 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
11a20 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
11a30 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
11a40 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
11a50 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
11a60 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
11a70 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
11a80 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
11a90 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
11aa0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
11ab0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
11ac0 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
11ad0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
11ae0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
11af0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11b00 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
11b10 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
11b20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
11b30 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
11b40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
11b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
11b60 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
11b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
11b80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
11b90 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
11ba0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
11bb0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
11bc0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
11bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
11be0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
11bf0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11c00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11c10 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
11c20 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
11c30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
11c40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
11c50 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
11c60 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
11c70 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
11c80 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
11c90 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
11ca0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
11cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
11cc0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
11cd0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
11ce0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
11cf0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
11d00 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
11d10 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
11d20 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
11d30 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
11d40 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
11d50 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
11d60 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
11d70 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
11d80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
11d90 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
11da0 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
11db0 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
11dc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
11dd0 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20   (u64)nLimit .  
11de0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
11df0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
11e00 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
11e10 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
11e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11e30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11e40 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
11e50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11e60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
11e70 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
11e80 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
11e90 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
11ea0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
11eb0 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
11ec0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
11ed0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
11ee0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
11ef0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
11f00 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
11f10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
11f20 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
11f30 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
11f40 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
11f50 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
11f60 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
11f70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
11f80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
11f90 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
11fa0 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
11fb0 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
11fc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11fd0 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
11fe0 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
11ff0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
12000 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
12010 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
12020 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
12030 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
12040 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
12050 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
12060 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
12070 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
12080 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
12090 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
120a0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
120b0 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
120c0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
120d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
120e0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
120f0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
12100 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
12110 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
12120 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12130 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
12140 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
12150 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
12160 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
12170 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
12180 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
12190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
121a0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
121b0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
121c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
121d0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
121e0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
121f0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
12200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12210 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
12220 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
12230 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12240 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
12250 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
12260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12270 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12280 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
12290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
122a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
122b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
122c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
122d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
122e0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
122f0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
12300 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
12310 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
12320 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
12330 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
12340 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
12350 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12360 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
12370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
12380 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
12390 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
123a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
123b0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
123c0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
123d0 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
123e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
123f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
12400 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
12410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
12420 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
12430 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
12440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12450 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12460 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12470 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12480 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
12490 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
124a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
124b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
124c0 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
124d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
124e0 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
124f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
12500 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
12510 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
12520 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
12530 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12540 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
12550 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
12560 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
12570 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
12580 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
12590 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
125a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
125b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
125c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
125d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
125e0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
125f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
12600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12610 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12620 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
12630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
12650 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
12660 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
12670 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
12680 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
12690 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
126a0 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
126b0 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
126c0 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
126d0 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
126e0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
126f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12700 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
12710 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
12720 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
12730 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
12740 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
12750 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12760 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
12770 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
12780 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
12790 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
127a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
127b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
127c0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
127d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
127e0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
127f0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
12800 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
12810 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
12820 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
12830 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
12840 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
12850 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
12860 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
12870 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
12880 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
12890 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
128a0 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
128b0 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
128c0 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
128d0 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
128e0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
128f0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
12900 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
12910 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
12920 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12930 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12940 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
12950 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
12960 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
12970 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
12980 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
12990 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
129a0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
129b0 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
129c0 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
129d0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
129e0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
129f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
12a00 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
12a10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12a20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
12a30 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
12a40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12a50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
12a60 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12a70 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
12a80 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12aa0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
12ab0 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
12ac0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
12ae0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
12af0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12b00 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
12b10 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
12b20 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
12b30 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12b50 2c 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69  , 0, 0, &dest, i
12b60 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
12b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12b80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12b90 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
12ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bb0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
12bc0 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
12bd0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12be0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
12bf0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12c00 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
12c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12c20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12c30 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
12c40 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12c50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12c60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
12c70 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
12c80 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
12c90 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
12ca0 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
12cb0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
12cc0 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
12cd0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
12ce0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
12cf0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
12d00 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
12d10 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
12d20 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
12d30 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
12d40 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
12d50 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
12d60 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
12d70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12d80 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
12d90 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
12da0 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
12db0 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
12dc0 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
12dd0 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
12de0 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
12df0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12e00 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
12e10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
12e20 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
12e30 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
12e40 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12e50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12e60 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
12e70 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
12e80 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
12e90 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
12ea0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
12eb0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
12ec0 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
12ed0 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
12ee0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
12ef0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
12f00 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12f10 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
12f20 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
12f30 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
12f40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12f50 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
12f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
12f70 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
12f80 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
12f90 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
12fa0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
12fb0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
12fc0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
12fd0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
12fe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12ff0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
13000 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
13010 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13020 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13030 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13040 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13050 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
13060 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
13070 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
13080 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
13090 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
130a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
130b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
130c0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
130d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
130e0 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
130f0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
13100 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
13110 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
13120 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13130 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
13140 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
13150 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
13160 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
13170 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
13180 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13190 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
131a0 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
131b0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
131c0 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
131d0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
131e0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
131f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13200 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
13210 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
13220 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
13230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13240 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
13250 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
13260 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
13270 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
13280 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
13290 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
132a0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
132b0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
132c0 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
132d0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
132e0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
132f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
13300 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
13310 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
13320 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
13330 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
13340 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
13350 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
13360 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
13370 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
13380 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13390 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
133a0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
133b0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
133c0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
133d0 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
133e0 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
133f0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
13400 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
13410 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
13420 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
13430 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
13440 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
13450 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
13460 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
13470 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
13480 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
13490 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
134a0 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
134b0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
134c0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
134d0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
134e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
134f0 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
13500 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13510 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13520 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
13530 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
13540 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
13550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13560 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
13570 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
13580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13590 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
135a0 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
135b0 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43  t, r1, 0); VdbeC
135c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
135d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
135e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
135f0 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
13600 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13610 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
13620 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
13640 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
13650 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
13660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13670 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
13680 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
13690 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
136a0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
136b0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
136c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
136d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
136e0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
136f0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
13700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13710 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
13720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13730 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13740 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
13750 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13760 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
13770 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
13780 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
13790 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
137a0 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
137b0 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
137c0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
137d0 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
137e0 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
137f0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
13800 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
13810 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
13820 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
13830 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
13840 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
13850 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
13860 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
13870 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
13880 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13890 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
138a0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
138b0 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
138c0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
138d0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
138e0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
138f0 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
13900 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
13910 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
13920 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
13930 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
13940 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
13950 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13960 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
13970 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
139a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
139b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
139c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
139d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
139e0 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
139f0 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
13a00 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
13a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
13a20 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
13a30 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
13a40 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
13a50 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
13a60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
13a70 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
13a80 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
13a90 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
13aa0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13ab0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13ac0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
13ad0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
13ae0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
13af0 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
13b00 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
13b10 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
13b20 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
13b30 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
13b40 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
13b50 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
13b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
13b70 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
13b80 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
13ba0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
13bb0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
13bc0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
13bd0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
13be0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
13bf0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13c00 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
13c10 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
13c20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
13c30 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
13c40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
13c50 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
13c60 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
13c70 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
13c80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
13c90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
13ca0 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
13cb0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
13cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
13cd0 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
13ce0 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
13cf0 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
13d00 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
13d10 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
13d20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
13d30 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
13d40 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
13d50 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
13d60 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
13d70 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
13d80 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
13d90 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
13da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
13db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13dc0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
13dd0 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
13de0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13df0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
13e00 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
13e10 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
13e20 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
13e50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
13e60 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
13e70 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
13e80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
13e90 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
13ea0 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
13eb0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
13ec0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
13ed0 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
13ee0 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
13ef0 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
13f00 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
13f10 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
13f20 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
13f30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
13f40 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
13f50 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
13f60 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
13f70 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
13f80 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
13f90 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
13fa0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
13fb0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
13fc0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
13fd0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
13fe0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
13ff0 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
14000 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
14010 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
14020 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
14030 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
14040 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
14050 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14060 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
14070 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
14080 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
14090 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
140a0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
140b0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
140c0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
140d0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
140e0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
140f0 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
14100 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
14110 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
14120 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
14130 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
14140 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
14150 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
14160 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
14170 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
14180 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
14190 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
141a0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
141b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
141c0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
141d0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
141e0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
141f0 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
14200 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
14210 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
14220 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
14230 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14240 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14250 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
14260 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
14270 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
14280 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
14290 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
142a0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
142b0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
142c0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
142d0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
142e0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
142f0 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
14300 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
14310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14320 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
14330 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
14340 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
14350 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
14360 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
14370 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
14380 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
14390 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
143a0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
143b0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
143c0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
143d0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
143e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
143f0 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
14400 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
14410 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
14420 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
14430 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
14440 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
14450 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14460 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
14470 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
14480 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14490 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
144a0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
144b0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
144c0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
144d0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
144e0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
144f0 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
14500 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14510 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
14520 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
14530 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  e(v);.    j2 = s
14540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14550 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
14560 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
14570 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
14580 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
145b0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
145c0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
145d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
145e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
145f0 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
14600 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65  nue, j2+2); Vdbe
14610 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14620 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14630 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
14640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14650 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
14660 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
14670 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
14680 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
14690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
146a0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
146b0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
146c0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
146d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
146e0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
146f0 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
14700 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
14710 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
14720 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
14730 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
14740 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
14750 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
14760 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
14770 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
14780 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
14790 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
147a0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
147b0 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
147c0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
147d0 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
147e0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
147f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14800 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
14810 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
14820 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14840 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
14850 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
14860 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
14870 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
14880 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
14890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
148a0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
148b0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
148c0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
148d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
148f0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
14900 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
14910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14920 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
14930 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14940 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
14950 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14960 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
14970 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
14980 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14990 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
149a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
149b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
149c0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
149d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
149e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
149f0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
14a00 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
14a10 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
14a20 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
14a30 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
14a40 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
14a50 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
14a60 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
14a70 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
14a80 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
14a90 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
14aa0 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
14ab0 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
14ac0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
14ad0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
14ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14af0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
14b00 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
14b10 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
14b20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14b30 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
14b40 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
14b50 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
14b60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14b70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14b80 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
14b90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14ba0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
14bb0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
14bc0 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
14bd0 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
14be0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14bf0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14c00 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
14c10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14c20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c30 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
14c40 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
14c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
14c60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14c70 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
14c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
14c90 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
14ca0 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
14cb0 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
14cc0 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
14cd0 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
14ce0 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
14cf0 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
14d00 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
14d10 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
14d20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14d30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14d40 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
14d50 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
14d60 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
14d70 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
14d80 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
14d90 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
14da0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
14db0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
14dc0 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
14dd0 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
14de0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
14df0 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
14e00 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
14e10 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
14e20 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
14e30 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
14e40 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
14e50 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
14e60 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
14e70 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
14e80 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
14e90 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14ea0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
14eb0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
14ec0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14ed0 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
14ee0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
14ef0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
14f00 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
14f10 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
14f20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
14f30 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
14f40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
14f50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
14f60 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
14f70 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
14f80 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
14f90 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
14fa0 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
14fb0 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
14fc0 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
14fd0 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
14fe0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
14ff0 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
15000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
15010 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
15020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
15030 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
15040 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
15050 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
15060 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
15070 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
15080 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
15090 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
150a0 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
150b0 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
150c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150d0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
150e0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
150f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
15110 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
15120 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
15130 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
15140 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
15150 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
15160 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
15170 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
15180 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
15190 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
151a0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
151b0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
151c0 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
151d0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
151e0 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
151f0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
15200 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
15210 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
15220 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
15230 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
15240 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
15250 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
15260 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
15270 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
15280 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
15290 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
152a0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
152b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
152c0 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
152d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152e0 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
152f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
15300 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
15310 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15320 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
15330 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
15340 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
15350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15360 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
15370 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
15380 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
15390 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
153a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
153b0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
153c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
153d0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
153e0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
153f0 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
15400 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
15410 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
15420 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
15430 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15440 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15450 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
15460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15470 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
15480 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
15490 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
154a0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
154b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
154c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
154d0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
154e0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
154f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
15500 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
15510 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
15520 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
15530 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
15540 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
15550 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
15560 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
15570 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
15580 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
15590 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
155a0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
155b0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
155c0 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
155d0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
155e0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
155f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15600 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
15610 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
15620 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
15630 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
15640 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
15650 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
15660 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
15670 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
15680 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
15690 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
156a0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
156b0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
156c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
156d0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
156e0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
156f0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
15700 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
15710 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
15720 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
15730 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
15740 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
15750 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
15760 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
15770 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
15790 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
157a0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
157b0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
157c0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
157d0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
157e0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
157f0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
15800 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
15810 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
15820 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
15830 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
15840 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
15850 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
15860 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
15870 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
15880 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
15890 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
158a0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
158b0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
158c0 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
158d0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
158e0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
158f0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
15900 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
15910 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
15920 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
15930 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
15940 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
15950 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
15960 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
15970 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
15980 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
15990 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
159a0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
159b0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
159c0 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
159d0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
159e0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
159f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
15a00 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
15a10 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
15a20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
15a30 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
15a40 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
15a50 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
15a90 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
15aa0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
15ab0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
15ac0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
15ad0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
15ae0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
15af0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
15b00 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
15b10 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
15b20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
15b30 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
15b40 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
15b50 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
15b60 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
15b70 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
15b80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
15b90 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
15ba0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
15bb0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
15bc0 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
15bd0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
15be0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
15bf0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
15c00 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
15c10 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
15c20 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
15c30 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
15c40 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
15c50 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
15c60 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
15c70 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
15c80 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
15c90 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
15ca0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
15cb0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
15cc0 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
15cd0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
15ce0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
15cf0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
15d00 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
15d10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
15d20 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
15d30 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
15d40 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
15d50 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
15d60 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
15d70 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
15d80 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
15d90 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
15da0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
15db0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
15dc0 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
15dd0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
15de0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
15df0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
15e00 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
15e10 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
15e20 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
15e30 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
15e40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
15e50 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
15e60 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
15e70 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
15e80 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
15e90 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
15ea0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
15eb0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
15ec0 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
15ed0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
15ee0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
15ef0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
15f00 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
15f10 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
15f20 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
15f30 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
15f40 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
15f50 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
15f60 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
15f70 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
15f80 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
15f90 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
15fa0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
15fb0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
15fc0 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
15fd0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
15fe0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
15ff0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
16000 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
16010 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
16020 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
16030 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
16040 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
16050 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
16060 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
16070 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
16080 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
16090 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
160a0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
160b0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
160c0 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
160d0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
160e0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
160f0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
16100 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
16110 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
16120 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
16130 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
16140 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
16150 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
16160 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
16170 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
16180 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
16190 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
161a0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
161b0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
161c0 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
161d0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
161e0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
161f0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
16200 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
16210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
16220 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
16230 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
16240 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
16250 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16260 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
16270 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
16280 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16290 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
162a0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
162b0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
162c0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
162d0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
162e0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
162f0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
16300 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
16310 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16320 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
16330 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
16340 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
16350 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
16360 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
16370 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
16380 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16390 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
163a0 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
163b0 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
163c0 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
163d0 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
163e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
163f0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
16400 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
16410 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
16420 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
16430 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
16440 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
16450 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
16460 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
16470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16480 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
16490 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
164a0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
164b0 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
164c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
164d0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
164e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
164f0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
16500 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
16510 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
16520 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
16530 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
16540 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
16550 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
16560 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
16570 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
16580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16590 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
165a0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
165b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
165c0 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
165d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
165e0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
165f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
16600 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
16610 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
16620 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
16630 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
16640 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
16650 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16660 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
16670 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
16680 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
16690 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
166a0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
166b0 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
166c0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
166d0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
166e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
166f0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
16700 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
16710 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
16720 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
16730 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16740 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
16750 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
16760 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
16770 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
16780 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
16790 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
167a0 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
167b0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
167c0 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
167d0 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
167e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
167f0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
16800 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
16810 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
16820 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
16830 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
16840 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
16850 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
16860 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
16870 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
16880 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
16890 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
168a0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
168b0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
168c0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
168d0 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
168e0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
168f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
16900 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
16910 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
16920 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
16930 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
16940 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
16950 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
16960 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
16970 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
16980 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
16990 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
169a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
169b0 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
169c0 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
169d0 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
169e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
169f0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
16a00 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
16a10 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
16a20 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
16a30 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
16a40 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
16a50 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
16a60 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
16a70 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16a80 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
16a90 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
16aa0 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
16ab0 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
16ac0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
16ad0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
16ae0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
16af0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
16b00 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
16b10 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
16b20 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
16b30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16b40 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
16b50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
16b60 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
16b70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
16b80 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
16b90 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
16ba0 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
16bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16bc0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
16bd0 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
16be0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
16bf0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
16c00 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
16c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16c20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
16c30 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
16c40 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
16c50 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
16c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
16c70 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
16c80 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
16c90 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
16ca0 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
16cb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
16cc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
16ce0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
16cf0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
16d00 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
16d10 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
16d20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
16d30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16d40 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
16d50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16d60 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
16d70 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
16d80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
16d90 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
16da0 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
16db0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
16dc0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
16dd0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
16de0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
16df0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
16e00 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
16e10 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
16e20 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
16e30 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
16e40 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
16e50 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
16e60 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
16e70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
16e80 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
16e90 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
16ea0 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
16eb0 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
16ec0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16ed0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
16ee0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
16ef0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
16f00 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
16f10 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
16f20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
16f30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
16f40 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16f50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
16f60 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
16f70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
16f80 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
16f90 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
16fa0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
16fb0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
16fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16fd0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
16fe0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
16ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17000 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
17010 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
17020 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
17030 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
17040 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
17050 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
17060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17070 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
17080 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
17090 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
170a0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
170b0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
170c0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
170d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
170e0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
170f0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
17100 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
17110 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
17120 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
17130 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
17140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17150 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
17160 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
17170 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
17180 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
17190 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
171a0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
171b0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
171c0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
171d0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
171e0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
171f0 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
17200 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
17210 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
17220 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
17230 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
17240 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
17250 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
17260 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
17270 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
17280 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
17290 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
172a0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
172b0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
172c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
172d0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
172e0 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
172f0 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
17300 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17310 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17320 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
17330 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
17340 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
17350 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17360 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
17370 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
17380 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49  .          && pI
17390 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
173a0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
173b0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
173c0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
173d0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
173e0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
173f0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
17400 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
17410 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
17420 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
17430 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
17440 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
17450 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
17460 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
17470 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
17480 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
17490 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
174a0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
174b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
174c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
174d0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
174e0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
174f0 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
17500 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
17510 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
17520 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
17530 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
17540 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
17550 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
17560 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
17570 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
17580 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
17590 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
175a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
175b0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
175c0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
175d0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
175e0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
175f0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
17600 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
17610 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
17620 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
17630 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
17640 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
17650 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
17660 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
17670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17680 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
17690 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
176a0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
176b0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
176c0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
176d0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
176e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
176f0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
17700 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
17710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17720 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
17730 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
17740 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
17750 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
17760 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
17770 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
17780 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
17790 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
177a0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
177b0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
177c0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
177d0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
177e0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
177f0 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
17800 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
17810 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
17820 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
17830 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
17840 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
17850 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
17860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
17870 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
17880 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
17890 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
178a0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
178b0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
178c0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
178d0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
178e0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
178f0 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
17900 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
17910 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
17920 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
17930 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
17940 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
17950 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
17960 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
17970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17980 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
17990 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
179a0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
179e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179f0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
17a00 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
17a10 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
17a20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
17a30 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
17a40 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
17a50 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
17a60 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
17a70 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
17a80 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
17a90 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
17aa0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
17ab0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
17ac0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
17ad0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
17ae0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
17af0 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
17b00 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
17b10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
17b20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
17b30 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
17b40 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
17b50 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
17b60 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17b70 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
17b80 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
17b90 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
17ba0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
17bb0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
17bc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17bd0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
17be0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
17bf0 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
17c00 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
17c10 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
17c20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17c30 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
17c40 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
17c50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17c60 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
17c70 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
17c80 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
17c90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
17ca0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
17cb0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
17cc0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
17cd0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
17ce0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
17cf0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
17d00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17d10 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
17d20 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
17d30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17d40 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
17d50 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
17d60 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17d70 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  v, j1);..  /* Ge
17d80 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
17d90 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
17da0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
17db0 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
17dc0 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
17dd0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
17de0 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
17df0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
17e00 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
17e10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17e20 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
17e30 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
17e40 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
17e50 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
17e60 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
17e70 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
17e80 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
17e90 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
17ea0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
17eb0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
17ec0 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
17ed0 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
17ee0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
17ef0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
17f00 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
17f10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
17f20 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
17f30 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
17f40 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
17f50 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
17f60 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
17f70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17f80 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
17f90 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
17fa0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
17fb0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
17fc0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
17fd0 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
17fe0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
17ff0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
18000 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
18010 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
18020 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
18030 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
18040 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
18050 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
18060 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
18070 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
18090 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
180a0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
180b0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
180c0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
180d0 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
180e0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
180f0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
18100 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
18110 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
18120 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
18130 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
18140 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
18150 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
18160 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
18170 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
18180 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
18190 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
181a0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
181b0 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
181c0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
181d0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
18200 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
18220 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
18230 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
18240 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
18250 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
18260 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
18270 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
18280 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
18290 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
182a0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
182b0 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
182c0 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
182d0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
182e0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
182f0 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
18300 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
18310 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
18320 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
18330 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
18340 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
18350 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
18360 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
18370 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
18380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
18390 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
183a0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
183b0 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
183c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
183d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
183e0 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18420 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
18430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18440 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
18450 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
18460 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
18470 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
18480 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
18490 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
184a0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
184b0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
184c0 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
184d0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
184e0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
184f0 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
18500 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
18510 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
18520 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
18530 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
18540 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
18550 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
18560 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
18570 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
18580 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
18590 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
185a0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
185b0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
185c0 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
185d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
185e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
185f0 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
18600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18610 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
18620 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
18630 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
18640 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
18650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18660 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
18670 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
18680 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18690 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
186a0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
186b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
186c0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
186d0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
186e0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
186f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18700 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
18710 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
18720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18730 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
18740 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
18750 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18760 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
18780 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
18790 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
187a0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
187b0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
187c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
187d0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
187e0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
187f0 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
18800 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
18810 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
18820 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
18830 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
18840 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
18850 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
18860 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
18870 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
18880 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
18890 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
188a0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
188b0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
188c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
188d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
188e0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
188f0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
18900 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18910 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
18920 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
18930 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
18940 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
18950 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
18960 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
18970 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
18980 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
18990 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
189a0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
189b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
189c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
189d0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
189e0 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
189f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18a00 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
18a10 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
18a20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18a50 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
18a60 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
18a70 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
18a80 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
18a90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
18aa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18ab0 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
18ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
18ad0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
18ae0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
18af0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18b10 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
18b20 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
18b30 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
18b40 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
18b50 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
18b60 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
18b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18b80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
18b90 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
18ba0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18bb0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
18bc0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
18bd0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
18be0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
18bf0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18c00 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
18c10 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
18c20 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
18c50 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
18c60 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
18c70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
18c80 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
18c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18ca0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
18cb0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
18cc0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
18cd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18ce0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
18cf0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
18d00 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
18d10 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
18d20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
18d30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18d40 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
18d50 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
18d60 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
18d70 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
18d80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
18d90 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
18da0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
18db0 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
18dc0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
18dd0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
18de0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
18df0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
18e00 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
18e10 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
18e20 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
18e30 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
18e40 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
18e50 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
18e60 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
18e70 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
18e80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
18e90 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
18ea0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18eb0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
18ec0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
18ed0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
18ee0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
18ef0 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
18f00 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
18f10 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
18f20 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
18f30 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
18f40 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
18f50 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
18f60 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
18f70 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
18f80 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
18f90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18fa0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
18fb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
18fc0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
18fd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18fe0 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
18ff0 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
19000 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
19010 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
19020 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
19030 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
19040 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
19050 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
19060 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
19070 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
19080 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
19090 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
190a0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
190b0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
190c0 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
190d0 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
190e0 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
190f0 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
19100 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
19110 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
19120 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
19130 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
19140 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
19150 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
19160 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
19170 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
19180 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
19190 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
191a0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
191b0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
191c0 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
191d0 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
191e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
191f0 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
19200 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
19210 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
19220 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
19230 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
19240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
19250 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
19260 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
19270 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
19280 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
19290 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
192a0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
192b0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
192c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
192d0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
192e0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
192f0 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
19300 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
19310 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
19320 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
19330 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
19340 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
19350 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
19360 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
19370 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
19380 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
19390 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
193a0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
193b0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
193c0 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
193d0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
193e0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
193f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19400 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
19410 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
19420 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
19430 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
19440 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
19450 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
19460 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
19470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
19480 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
19490 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
194a0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
194b0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
194c0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
194d0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
194e0 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
194f0 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
19500 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
19510 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
19520 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
19530 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
19540 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19550 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
19560 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
19570 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
19580 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
19590 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
195a0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
195b0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
195c0 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
195d0 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
195e0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
195f0 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
19600 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
19610 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
19620 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19630 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
19640 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
19650 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
19660 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
19670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19680 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
19690 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
196a0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
196b0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
196c0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
196d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
196e0 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
196f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
19700 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
19710 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
19720 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
19730 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
19740 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
19750 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
19760 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
19770 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
19780 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
19790 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
197a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
197b0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
197c0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
197d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
197e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
197f0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
19800 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
19810 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
19820 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
19830 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
19840 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
19850 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
19860 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
19870 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
19880 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
19890 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
198a0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
198b0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
198c0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
198d0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
198e0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
198f0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
19900 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
19910 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
19920 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
19930 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
19940 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
19950 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
19960 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
19970 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
19980 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19990 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
199a0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
199b0 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
199c0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
199d0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
199e0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
199f0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
19a00 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
19a10 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
19a20 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
19a30 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
19a40 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
19a50 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
19a60 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
19a70 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
19a80 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
19a90 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
19aa0 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
19ab0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
19ac0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
19ad0 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
19ae0 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
19af0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
19b00 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
19b10 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
19b20 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
19b30 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
19b40 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
19b50 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
19b60 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
19b70 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
19b80 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
19b90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19ba0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
19bb0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
19bc0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
19bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
19be0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
19bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19c00 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
19c10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
19c20 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
19c30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19c40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
19c50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
19c60 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
19c70 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
19c80 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
19c90 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
19ca0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
19cb0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
19cc0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19cd0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
19ce0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
19cf0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
19d00 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
19d10 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
19d20 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
19d30 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
19d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
19d50 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
19d60 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
19d70 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
19d80 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
19d90 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
19da0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
19db0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
19dc0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
19dd0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
19de0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
19df0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
19e00 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
19e10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
19e20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
19e30 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
19e40 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
19e50 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
19e60 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
19e70 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
19e80 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
19e90 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
19ea0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
19eb0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
19ec0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
19ed0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
19ee0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
19ef0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
19f00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
19f10 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
19f20 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
19f30 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
19f40 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
19f50 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
19f60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
19f70 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
19f80 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
19f90 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
19fa0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
19fb0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
19fc0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
19fd0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
19fe0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
19ff0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1a000 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1a010 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1a020 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1a030 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1a040 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1a050 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1a060 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1a070 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1a080 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
1a090 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1a0a0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1a0b0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
1a0c0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1a0d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a0e0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1a0f0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1a100 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
1a110 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1a120 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1a130 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1a140 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
1a150 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
1a160 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
1a170 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1a180 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
1a190 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
1a1a0 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
1a1b0 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
1a1c0 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
1a1d0 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
1a1e0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1a1f0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
1a200 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1a210 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1a220 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1a230 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1a240 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1a250 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1a260 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1a270 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1a280 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1a290 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1a2a0 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1a2b0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1a2c0 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1a2d0 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1a2e0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1a2f0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
1a300 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1a310 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1a320 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1a330 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1a340 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1a350 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1a360 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
1a370 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1a380 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1a390 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1a3a0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1a3b0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1a3c0 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
1a3d0 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
1a3e0 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
1a3f0 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
1a400 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
1a410 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
1a420 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
1a430 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
1a440 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
1a450 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1a460 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1a470 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1a480 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
1a490 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
1a4a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1a4b0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1a4c0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1a4d0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1a4e0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1a4f0 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
1a500 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1a510 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
1a520 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1a530 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1a540 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
1a550 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1a560 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1a570 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1a580 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1a590 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1a5a0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1a5b0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1a5c0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1a5d0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1a5e0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1a5f0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1a600 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1a610 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1a620 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1a630 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1a640 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1a650 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1a660 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1a670 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1a680 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1a690 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1a6a0 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1a6b0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1a6c0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1a6d0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1a6e0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1a6f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1a700 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1a710 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1a720 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1a730 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1a740 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1a750 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1a760 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1a770 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1a780 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1a790 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1a7a0 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1a7b0 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1a7c0 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1a7d0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1a7e0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1a7f0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1a800 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1a810 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1a820 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1a830 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1a840 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1a850 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1a860 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1a870 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1a880 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1a890 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1a8a0 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1a8b0 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1a8c0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1a8d0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1a8e0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1a8f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1a900 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1a910 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1a920 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1a930 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1a940 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1a950 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1a960 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1a970 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1a980 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1a990 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1a9a0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1a9b0 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1a9c0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1a9d0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1a9e0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1a9f0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1aa00 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1aa10 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1aa20 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1aa30 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1aa40 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1aa50 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1aa60 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1aa70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1aa80 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1aa90 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1aaa0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1aab0 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1aac0 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1aad0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1aae0 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1aaf0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1ab00 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1ab10 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1ab20 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1ab30 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1ab40 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1ab50 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1ab60 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1ab70 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1ab80 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1ab90 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1aba0 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1abb0 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1abc0 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1abd0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1abe0 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1abf0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1ac00 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1ac10 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1ac20 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1ac30 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1ac40 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1ac50 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1ac60 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1ac70 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1ac80 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1ac90 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1aca0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1acb0 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1acc0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1acd0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1ace0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1acf0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1ad00 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1ad10 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1ad20 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1ad30 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1ad40 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1ad50 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1ad60 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1ad70 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1ad80 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1ad90 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1ada0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1adb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1adc0 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1add0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1ade0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1adf0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1ae00 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1ae10 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1ae20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1ae30 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1ae40 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1ae50 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1ae60 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1ae70 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1ae80 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1ae90 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1aea0 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1aeb0 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1aec0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1aed0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1aee0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1aef0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1af00 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1af10 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1af20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1af30 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1af40 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1af50 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1af60 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1af70 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1af80 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1af90 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1afa0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1afb0 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1afc0 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1afd0 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1afe0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1aff0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1b000 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1b010 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1b020 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1b030 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1b040 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1b050 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1b060 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1b070 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1b080 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1b090 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1b0a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b0b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1b0c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1b0d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1b0e0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1b0f0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1b100 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1b110 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1b120 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1b130 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1b140 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1b150 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1b160 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1b170 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1b180 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1b190 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1b1a0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1b1b0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1b1c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1b1d0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1b1e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1b1f0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1b200 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1b210 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1b220 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1b230 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1b240 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1b250 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1b260 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1b270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b280 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1b290 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1b2a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1b2b0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1b2c0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1b2d0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1b2e0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1b2f0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1b300 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1b310 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1b320 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1b330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b340 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1b350 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1b360 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1b370 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1b380 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1b390 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1b3a0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1b3b0 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1b3c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1b3d0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1b3e0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1b3f0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1b400 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
1b410 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1b420 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1b430 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1b440 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1b450 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1b460 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1b470 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1b480 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1b490 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1b4a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1b4b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1b4c0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1b4d0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1b4e0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1b4f0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1b500 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1b510 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1b520 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1b530 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b540 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1b550 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1b560 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1b570 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1b580 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1b590 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1b5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1b5b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1b5c0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1b5f0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1b600 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b610 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1b620 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1b630 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1b640 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1b650 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1b660 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1b670 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1b680 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1b690 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1b6a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1b6b0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1b6c0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1b6d0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1b6e0 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1b6f0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1b700 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1b710 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1b720 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1b730 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1b740 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1b750 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1b760 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1b770 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1b780 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1b790 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1b7a0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1b7b0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1b7c0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1b7d0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1b7e0 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
1b7f0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
1b800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b810 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1b820 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
1b830 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
1b840 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1b850 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b860 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1b870 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
1b880 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1b890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1b8a0 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1b8b0 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1b8c0 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1b8d0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1b8e0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1b8f0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1b900 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1b910 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
1b920 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
1b930 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
1b940 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
1b950 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
1b960 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
1b970 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
1b980 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1b990 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
1b9a0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1b9b0 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
1b9c0 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
1b9d0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
1b9e0 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
1b9f0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1ba00 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
1ba10 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1ba20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ba30 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
1ba40 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
1ba50 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
1ba60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ba80 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
1ba90 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1baa0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75  lags & SF_Compou
1bab0 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e  nd)!=0 && pSub->
1bac0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
1bad0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1bb10 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
1bb20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1bb30 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1bb60 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
1bb70 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1bb80 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1bb90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1bba0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1bbb0 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
1bbc0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1bbd0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
1bbe0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
1bbf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1bc00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1bc10 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
1bc20 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1bc30 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1bc40 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
1bc50 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1bc60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1bc70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1bc80 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
1bc90 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1bca0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1bcb0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
1bcc0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bcf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1bd00 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
1bd10 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
1bd20 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
1bd30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1bd40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1bd50 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
1bd60 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1bd70 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
1bd80 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1bd90 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1bda0 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
1bdb0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1bdc0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1bdd0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
1bde0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1bdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1be00 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
1be10 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
1be20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1be30 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
1be40 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1be50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 32 29  Restriction (22)
1be60 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
1be70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1be80 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d  ursive) && pSub-
1be90 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
1bea0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 28 32 33   0;       /* (23
1beb0 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f  )  */..  /* OBSO
1bec0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
1bed0 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1bee0 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
1bef0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
1bf00 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1bf10 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
1bf20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
1bf30 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1bf40 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
1bf50 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
1bf60 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
1bf70 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1bf80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1bf90 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1bfa0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
1bfb0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1bfc0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1bfd0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1bfe0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1bff0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1c000 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
1c010 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
1c020 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
1c030 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
1c040 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
1c050 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
1c060 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
1c070 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1c080 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
1c090 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1c0a0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
1c0b0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1c0c0 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
1c0d0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
1c0e0 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
1c0f0 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
1c100 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1c110 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1c120 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1c130 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1c140 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
1c150 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1c160 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1c170 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1c180 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1c190 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1c1a0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
1c1b0 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
1c1c0 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
1c1d0 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
1c1e0 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
1c1f0 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
1c200 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
1c210 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
1c220 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
1c230 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
1c240 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
1c250 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
1c260 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
1c270 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
1c280 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
1c290 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
1c2a0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
1c2b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
1c2c0 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
1c2d0 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
1c2e0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
1c2f0 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
1c300 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1c310 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
1c320 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1c330 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
1c340 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
1c350 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
1c360 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1c370 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1c380 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1c390 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
1c3a0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1c3b0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1c3c0 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
1c3d0 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
1c3e0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
1c3f0 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
1c400 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
1c410 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
1c420 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
1c430 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
1c440 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
1c450 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
1c460 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
1c470 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
1c480 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
1c490 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
1c4a0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1c4b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c4c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1c4d0 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
1c4e0 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
1c4f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c500 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
1c510 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
1c520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c530 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1c540 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
1c550 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
1c560 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
1c570 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1c580 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1c590 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1c5a0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1c5b0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
1c5c0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1c5d0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1c5e0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1c5f0 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
1c600 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
1c610 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
1c620 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1c630 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1c640 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1c650 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1c660 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1c670 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1c680 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1c690 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1c6a0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1c6b0 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e         || pSub->
1c6c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
1c6d0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
1c6e0 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  xpr.      ){.   
1c6f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1c700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
1c710 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
1c720 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
1c730 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
1c740 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
1c750 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1c760 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
1c770 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
1c780 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
1c790 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
1c7a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1c7b0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
1c7c0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1c7d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1c7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c7f0 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
1c800 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1c810 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
1c820 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
1c830 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  **/..  /* Author
1c840 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1c850 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1c860 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1c870 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1c880 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1c890 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1c8a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1c8b0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1c8c0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1c8d0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1c8e0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1c8f0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1c900 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1c910 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1c920 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1c930 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1c940 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1c950 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1c960 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1c970 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1c980 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1c990 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1c9a0 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1c9b0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1c9c0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1c9d0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1c9e0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1c9f0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1ca00 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1ca10 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ca20 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1ca30 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1ca40 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1ca50 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1ca60 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1ca70 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
1ca80 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
1ca90 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
1caa0 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
1cab0 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
1cac0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
1cad0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
1cae0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
1caf0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
1cb00 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
1cb10 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
1cb20 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
1cb30 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1cb40 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
1cb50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1cb60 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
1cb70 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
1cb80 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
1cb90 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1cba0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1cbb0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1cbc0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
1cbd0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1cbe0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1cbf0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1cc00 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
1cc10 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
1cc20 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
1cc30 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
1cc40 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
1cc50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1cc60 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
1cc70 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
1cc80 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1cc90 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1cca0 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
1ccb0 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
1ccc0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ccd0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1cce0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
1ccf0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
1cd00 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
1cd10 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1cd20 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
1cd30 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
1cd40 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1cd50 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
1cd60 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
1cd70 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
1cd80 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1cd90 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
1cda0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1cdb0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1cdc0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
1cdd0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
1cde0 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
1cdf0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
1ce00 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
1ce10 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
1ce20 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
1ce30 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1ce40 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
1ce50 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1ce60 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1ce70 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1ce80 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
1ce90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1cea0 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
1ceb0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
1cec0 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
1ced0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1cee0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1cef0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1cf00 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1cf10 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
1cf20 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1cf30 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
1cf40 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1cf50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf60 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1cf70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
1cf80 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
1cf90 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
1cfa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1cfb0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
1cfc0 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1cfd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1cfe0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1cff0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1d000 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
1d010 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
1d020 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
1d030 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
1d040 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1d050 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
1d060 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
1d070 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
1d080 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
1d090 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
1d0a0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
1d0b0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1d0c0 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
1d0d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d0e0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1d0f0 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1d100 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1d110 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1d120 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d130 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1d140 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1d150 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1d160 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1d170 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1d180 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1d190 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1d1a0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1d1b0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1d1c0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1d1d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d1e0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1d1f0 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1d200 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1d210 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1d220 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1d230 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1d240 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1d250 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1d260 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1d270 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1d280 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1d290 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1d2a0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1d2b0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1d2c0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1d2d0 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1d2e0 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1d2f0 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1d300 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1d310 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1d320 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1d330 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1d340 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1d350 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1d360 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1d370 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1d380 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1d390 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1d3a0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1d3b0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1d3c0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1d3d0 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1d3e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1d3f0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1d400 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1d410 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1d420 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1d430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1d440 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1d450 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1d460 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1d470 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1d480 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1d490 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1d4a0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1d4b0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1d4c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1d4d0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1d4e0 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1d4f0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1d500 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1d510 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1d520 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1d530 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1d540 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1d550 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1d560 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1d570 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1d580 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1d590 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1d5a0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1d5b0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1d5c0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1d5d0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1d5e0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1d5f0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1d600 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1d610 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1d620 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1d630 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1d640 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1d650 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1d660 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1d670 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1d680 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1d690 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1d6a0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1d6b0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1d6c0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1d6d0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1d6e0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1d6f0 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1d700 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1d710 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1d720 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1d730 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1d740 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1d750 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1d760 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1d770 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1d780 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1d790 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1d7a0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1d7b0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1d7c0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1d7d0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1d7e0 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1d7f0 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1d800 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1d810 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1d820 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1d830 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1d840 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1d850 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1d860 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1d870 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1d880 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1d890 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1d8a0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
1d8b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d8c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1d8d0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
1d8e0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
1d8f0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
1d900 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
1d910 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1d920 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1d930 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
1d940 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d950 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
1d960 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1d970 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1d980 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d990 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d9a0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1d9b0 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
1d9c0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
1d9d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1d9e0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
1d9f0 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
1da00 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
1da10 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
1da20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
1da30 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
1da40 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1da50 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
1da60 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
1da70 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
1da80 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
1da90 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
1daa0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1dab0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
1dac0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
1dad0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
1dae0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
1daf0 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
1db00 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
1db10 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
1db20 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1db30 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
1db40 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1db50 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
1db60 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
1db70 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
1db80 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
1db90 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
1dba0 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
1dbb0 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73  out query to 4 s
1dbc0 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c  lots.  The middl
1dbd0 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  e.    ** slot is
1dbe0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
1dbf0 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
1dc00 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1dc10 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f  r the.    ** two
1dc20 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1dc30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1dc40 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1dc50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
1dc60 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
1dc70 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1dc80 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1dc90 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1dca0 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
1dcb0 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
1dcc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1dcd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1dce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1dcf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
1dd00 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
1dd10 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
1dd20 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
1dd30 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
1dd40 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1dd50 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1dd60 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1dd70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
1dd80 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1dd90 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
1dda0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  pUsing);.      p
1ddb0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1ddc0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1ddd0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1dde0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1ddf0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1de00 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1de10 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1de20 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1de30 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1de40 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1de50 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1de60 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1de70 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1de80 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1de90 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1dea0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1deb0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1dec0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ded0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1dee0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1def0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1df00 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1df10 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1df20 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1df40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1df50 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1df60 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
1df70 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
1df80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1df90 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1dfa0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1dfb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
1dfc0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
1dfd0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
1dfe0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
1dff0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
1e000 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
1e010 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
1e020 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
1e030 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1e040 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
1e050 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
1e060 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
1e070 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
1e080 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1e090 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1e0a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1e0b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e0c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e0d0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1e0e0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1e0f0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
1e100 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
1e110 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
1e120 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
1e130 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1e140 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
1e150 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45      }.    substE
1e160 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1e170 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  ent->pEList, iPa
1e180 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1e190 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41  st);.    if( isA
1e1a0 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  gg ){.      subs
1e1b0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1e1c0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c  arent->pGroupBy,
1e1d0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1e1e0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1e1f0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1e200 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1e210 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1e220 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1e230 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1e240 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1e250 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1e260 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1e270 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
1e280 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1e290 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
1e2a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
1e2b0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
1e2c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1e2d0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1e2e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62  rBy ){.      sub
1e2f0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1e300 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1e310 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1e320 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1e330 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
1e340 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57  here ){.      pW
1e350 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1e360 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1e370 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1e380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68  }else{.      pWh
1e390 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ere = 0;.    }. 
1e3a0 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
1e3b0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
1e3c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1e3d0 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
1e3e0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1e3f0 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
1e400 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1e410 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
1e420 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1e430 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1e440 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1e450 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1e460 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1e470 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1e480 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1e490 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1e4a0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1e4b0 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20  ving, .         
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e4e0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1e4f0 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a  ->pHaving, 0));.
1e500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1e510 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d  arent->pGroupBy=
1e520 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1e530 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  ent->pGroupBy = 
1e540 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1e550 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72  up(db, pSub->pGr
1e560 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d  oupBy, 0);.    }
1e570 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
1e580 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75  ent->pWhere = su
1e590 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1e5a0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
1e5b0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1e5c0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1e5d0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
1e5e0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1e5f0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1e600 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
1e610 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
1e620 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
1e630 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
1e640 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
1e650 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1e660 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
1e670 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
1e680 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
1e690 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
1e6a0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e6b0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
1e6c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
1e6d0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
1e6e0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
1e6f0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
1e700 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
1e710 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
1e720 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
1e730 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
1e740 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
1e750 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
1e760 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
1e770 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
1e780 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
1e790 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
1e7a0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
1e7b0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
1e7c0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
1e7d0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
1e7e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
1e7f0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
1e800 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
1e810 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
1e820 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
1e830 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
1e840 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
1e850 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1e860 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
1e870 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
1e880 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e890 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1e8a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e8b0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1e8c0 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74  /*.** Based on t
1e8d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e8e0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
1e8f0 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1e900 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
1e910 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
1e920 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
1e930 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1e940 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1e950 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f    * the query co
1e960 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69  ntains just a si
1e970 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  ngle aggregate f
1e980 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a  unction,.**    *
1e990 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
1e9a0 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65  unction is eithe
1e9b0 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  r min() or max()
1e9c0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68  , and.**    * th
1e9d0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
1e9e0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1e9f0 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  tion is a column
1ea00 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
1ea10 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
1ea20 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  e are true, then
1ea30 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1ea40 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
1ea50 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65  RBY_MAX.** is re
1ea60 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70  turned as approp
1ea70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70  riate. Also, *pp
1ea80 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
1ea90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a   point to the .*
1eaa0 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  * list of argume
1eab0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
1eac0 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f  e aggregate befo
1ead0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1eae0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63  .** Or, if the c
1eaf0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
1eb00 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70  are not met, *pp
1eb10 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
1eb20 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f   0 and.** WHERE_
1eb30 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69  ORDERBY_NORMAL i
1eb40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1eb50 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
1eb60 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41  uery(AggInfo *pA
1eb70 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74  ggInfo, ExprList
1eb80 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
1eb90 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
1eba0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
1ebb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ebc0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1ebd0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20  *ppMinMax = 0;. 
1ebe0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1ebf0 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45  Func==1 ){.    E
1ec00 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67  xpr *pExpr = pAg
1ec10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
1ec20 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67  pExpr; /* Aggreg
1ec30 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
1ec40 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ec50 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1ec60 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41  pList;      /* A
1ec70 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
1ec80 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  function */..   
1ec90 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1eca0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
1ecb0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ION );.    if( p
1ecc0 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
1ecd0 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c  >nExpr==1 && pEL
1ece0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
1ecf0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
1ed00 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  MN ){.      cons
1ed10 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20  t char *zFunc = 
1ed20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1ed30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ed40 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
1ed50 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
1ed60 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
1ed70 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
1ed80 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
1ed90 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
1eda0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1edb0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
1edc0 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
1edd0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
1ede0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
1edf0 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
1ee00 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
1ee10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ee20 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
1ee30 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69  Max==0 || (*ppMi
1ee40 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20  nMax)->nExpr==1 
1ee50 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  );.  return eRet
1ee60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1ee70 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
1ee80 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ee90 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1eea0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
1eeb0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
1eec0 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65  d argment is the
1eed0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
1eee0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
1eef0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
1ef00 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
1ef10 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
1ef20 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
1ef30 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1ef40 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
1ef50 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
1ef60 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1ef70 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
1ef80 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
1ef90 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
1efa0 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
1efb0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
1efc0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
1efd0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
1efe0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
1eff0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f000 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
1f010 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1f020 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
1f030 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
1f040 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1f050 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
1f060 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
1f070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
1f080 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
1f090 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
1f0a0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1f0b0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
1f0c0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
1f0d0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
1f0e0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
1f0f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1f100 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
1f110 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
1f120 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
1f130 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
1f140 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
1f150 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
1f160 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
1f170 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1f180 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1f190 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1f1a0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
1f1b0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
1f1c0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
1f1d0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
1f1e0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
1f1f0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
1f200 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
1f210 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
1f220 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1f230 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1f240 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
1f250 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
1f260 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
1f270 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
1f280 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
1f290 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1f2a0 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
1f2b0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
1f2c0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1f2d0 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
1f2e0 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1f2f0 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
1f300 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
1f310 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
1f320 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
1f330 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
1f340 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
1f350 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
1f360 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
1f370 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
1f380 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
1f390 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
1f3a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
1f3b0 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
1f3c0 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
1f3d0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
1f3e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1f3f0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
1f400 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
1f410 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->zIndex ){.    
1f420 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1f430 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
1f440 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46  har *zIndex = pF
1f450 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20  rom->zIndex;.   
1f460 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1f470 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1f480 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
1f490 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
1f4a0 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
1f4b0 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a  Name, zIndex); .
1f4c0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
1f4d0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
1f4e0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
1f4f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1f500 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f510 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
1f520 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a  s", zIndex, 0);.
1f530 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
1f540 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1f550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f560 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1f570 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65      pFrom->pInde
1f580 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
1f590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f5a0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
1f5b0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1f5c0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
1f5d0 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
1f5e0 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
1f5f0 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
1f600 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1f610 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
1f620 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1f630 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
1f640 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
1f650 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
1f660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
1f670 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
1f680 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
1f690 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1f6a0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
1f6b0 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
1f6c0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
1f6d0 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
1f6e0 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
1f6f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
1f700 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
1f710 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
1f720 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
1f730 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
1f740 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
1f750 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
1f760 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
1f770 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
1f780 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
1f790 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
1f7a0 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
1f7b0 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
1f7c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1f7d0 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
1f7e0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
1f7f0 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
1f800 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
1f810 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
1f820 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
1f830 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
1f840 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
1f850 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
1f860 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
1f870 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
1f880 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
1f890 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1f8a0 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
1f8b0 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
1f8c0 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
1f8d0 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
1f8e0 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
1f8f0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
1f900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1f910 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
1f920 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
1f930 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1f940 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
1f950 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
1f960 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
1f970 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
1f980 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
1f990 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
1f9a0 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
1f9b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f9c0 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
1f9d0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
1f9e0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
1f9f0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
1fa00 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
1fa10 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
1fa20 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
1fa30 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
1fa40 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
1fa50 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
1fa60 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
1fa70 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
1fa80 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1fa90 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
1faa0 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
1fab0 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
1fac0 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
1fad0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
1fae0 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
1faf0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
1fb00 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
1fb10 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
1fb20 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
1fb30 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1fb40 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
1fb50 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
1fb60 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
1fb70 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
1fb80 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1fb90 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fba0 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
1fbb0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1fbc0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
1fbd0 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1fbe0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
1fbf0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
1fc00 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
1fc10 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
1fc20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
1fc30 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
1fc40 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
1fc50 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
1fc60 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
1fc70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1fc80 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
1fc90 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
1fca0 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
1fcb0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
1fcc0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1fcd0 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
1fce0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1fcf0 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ALL, 0));.  p->o
1fd00 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1fd10 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
1fd20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
1fd30 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
1fd40 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
1fd50 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
1fd60 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
1fd70 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
1fd80 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
1fd90 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
1fda0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1fdb0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
1fdc0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
1fdd0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
1fde0 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
1fdf0 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
1fe00 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
1fe10 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
1fe20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fe30 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
1fe40 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
1fe50 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
1fe60 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
1fe70 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
1fe80 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
1fe90 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
1fea0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
1feb0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
1fec0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
1fed0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
1fee0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
1fef0 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
1ff00 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
1ff10 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
1ff20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ff30 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
1ff40 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
1ff50 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
1ff60 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
1ff70 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
1ff80 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
1ff90 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
1ffa0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1ffb0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
1ffc0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
1ffd0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
1ffe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
1fff0 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
20000 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
20010 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
20020 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
20030 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20   outermost WITH 
20040 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
20050 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20060 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
20070 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
20080 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
20090 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
200a0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
200b0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
200c0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
200d0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
200e0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
200f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
20100 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
20110 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
20120 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
20130 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
20140 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
20150 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
20160 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
20170 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20180 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
20190 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
201a0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
201b0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
201c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
201d0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
201e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
201f0 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
20200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20210 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20220 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
20230 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
20240 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
20250 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
20260 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
20270 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
20280 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
20290 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
202a0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
202b0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
202c0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
202d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
202e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
202f0 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
20300 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
20310 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
20320 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
20330 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
20340 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
20350 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
20360 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
20370 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
20380 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
20390 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
203a0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
203b0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
203c0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
203d0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
203e0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
203f0 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
20400 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
20410 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
20420 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
20430 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
20440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
20450 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
20460 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
20470 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61   bFree==0 || pPa
20480 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b  rse->pWith==0 );
20490 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
204a0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
204b0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
204c0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
204d0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
204e0 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57    pParse->bFreeW
204f0 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d  ith = bFree;.  }
20500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20510 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
20520 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
20530 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
20540 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
20550 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
20560 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
20570 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
20580 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
20590 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
205a0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
205b0 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
205c0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
205d0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
205e0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
205f0 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
20600 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
20610 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
20620 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
20630 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
20640 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
20650 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
20660 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
20670 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
20680 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
20690 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
206a0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
206b0 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
206c0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
206d0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
206e0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
206f0 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
20700 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20710 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
20720 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
20730 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
20740 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
20750 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
20760 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
20770 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
20780 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
20790 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
207a0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
207b0 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
207c0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
207d0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
207e0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
207f0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
20800 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
20810 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
20820 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
20830 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
20840 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
20850 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
20860 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
20870 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
20880 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208a0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
208b0 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
208c0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
208d0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
208e0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
208f0 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
20900 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
20910 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
20920 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
20930 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
20940 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
20950 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
20960 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20980 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
20990 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
209a0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
209b0 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
209c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
209d0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
209e0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
209f0 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
20a00 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
20a10 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
20a20 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
20a30 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
20a40 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e   pCte->zErr is n
20a50 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  on-NULL at this 
20a60 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
20a70 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20   is an illegal. 
20a80 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
20a90 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45  reference to CTE
20aa0 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20   pCte. Leave an 
20ab0 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20  error in pParse 
20ac0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
20ad0 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65  * early. If pCte
20ae0 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  ->zErr is NULL, 
20af0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
20b00 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
20b10 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
20b20 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
20b30 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
20b40 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a  ( pCte->zErr ){.
20b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
20b70 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e  te->zErr, pCte->
20b80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
20b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20ba0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  R;.    }..    as
20bb0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
20bc0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
20bd0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
20be0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
20bf0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
20c00 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
20c10 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
20c20 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
20c30 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
20c40 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
20c50 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
20c60 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
20c70 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
20c80 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
20c90 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31  Tab->nRowEst = 1
20ca0 30 34 38 35 37 36 3b 0a 20 20 20 20 70 54 61 62  048576;.    pTab
20cb0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
20cc0 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  _Ephemeral;.    
20cd0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
20ce0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
20cf0 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
20d00 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
20d10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20d20 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
20d30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
20d40 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
20d50 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
20d60 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
20d70 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
20d80 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
20d90 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
20da0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
20db0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
20dc0 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
20dd0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
20de0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
20df0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
20e00 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
20e10 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
20e20 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
20e30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20e40 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
20e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
20e60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20e70 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
20e80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
20e90 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
20ea0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
20eb0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
20ec0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
20ed0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
20ee0 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
20ef0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
20f00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20f10 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
20f20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
20f30 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72    pItem->isRecur
20f40 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
20f50 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
20f60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
20f70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
20f80 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
20f90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20fa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
20fb0 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
20fc0 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
20fd0 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
20fe0 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
20ff0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21000 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
21010 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
21020 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
21030 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
21040 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
21050 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
21060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21070 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
21080 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
21090 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
210a0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
210b0 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
210c0 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
210d0 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72  ..    pCte->zErr
210e0 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
210f0 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
21100 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
21110 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
21120 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
21130 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69   pWith;.    sqli
21140 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
21150 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72  alker, bMayRecur
21160 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72  sive ? pSel->pPr
21170 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20  ior : pSel);..  
21180 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
21190 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
211a0 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
211b0 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
211c0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
211d0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
211e0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
211f0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
21200 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
21210 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
21220 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21230 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
21240 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
21250 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
21260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
21270 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
21280 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
21290 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
212a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
212b0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
212c0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
212d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
212e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
212f0 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
21300 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
21310 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f   }..    selectCo
21320 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
21330 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
21340 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
21350 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
21360 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
21370 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
21380 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
21390 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
213a0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
213b0 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
213c0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
213d0 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
213e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
213f0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65  pCte->zErr = "re
21400 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
21410 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
21420 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
21430 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
21440 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
21450 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
21460 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a  pCte->zErr = 0;.
21470 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
21480 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
21490 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
214a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
214b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
214c0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
214d0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
214e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
214f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
21500 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
21510 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
21520 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
21530 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
21540 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
21550 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
21560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21570 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
21580 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
21590 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
215a0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
215b0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
215c0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
215d0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
215e0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
215f0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
21600 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
21610 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
21620 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
21630 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
21640 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
21650 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
21660 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
21670 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
21680 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
21690 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
216a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
216b0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
216c0 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
216d0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
216e0 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
216f0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
21700 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
21710 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
21720 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
21730 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
21740 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
21750 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21760 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
21770 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
21780 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
21790 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
217a0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
217b0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
217c0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
217d0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
217e0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
217f0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
21800 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
21810 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
21820 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
21830 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
21840 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
21850 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
21860 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
21870 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
21880 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
21890 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
218a0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
218b0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
218c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
218d0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
218e0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
218f0 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
21900 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
21910 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
21920 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
21930 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
21940 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
21950 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
21960 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
21970 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
21980 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
21990 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
219a0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
219b0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
219c0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
219d0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
219e0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
219f0 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
21a00 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
21a10 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
21a20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
21a30 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
21a40 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
21a50 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
21a60 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
21a70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
21a80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
21a90 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
21aa0 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
21ab0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
21ac0 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
21ad0 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
21ae0 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
21af0 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
21b00 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
21b10 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
21b20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
21b30 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
21b40 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
21b50 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
21b60 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
21b70 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
21b80 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
21b90 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
21ba0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
21bb0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
21bc0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
21bd0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
21be0 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
21bf0 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
21c00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21c10 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
21c20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
21c30 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
21c40 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
21c50 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
21c60 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20  p->selFlags;..  
21c70 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
21c80 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
21c90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21ca0 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
21cb0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
21cc0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
21cd0 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c  pSrc==0) || (sel
21ce0 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
21cf0 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
21d00 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
21d10 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
21d20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
21d30 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
21d40 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
21d50 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52  sh(pParse, findR
21d60 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
21d70 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61  th, 0);..  /* Ma
21d80 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
21d90 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
21da0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
21db0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
21dc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21dd0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
21de0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
21df0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
21e00 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
21e10 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
21e20 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
21e30 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
21e40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21e50 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
21e60 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
21e70 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
21e80 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
21e90 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
21ea0 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
21eb0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
21ec0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
21ed0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
21ee0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
21ef0 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
21f00 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
21f10 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
21f20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
21f30 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
21f40 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
21f50 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
21f60 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
21f70 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b  | pFrom->pTab );
21f80 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
21f90 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
21fa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
21fb0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
21fc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
21fd0 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
21fe0 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
21ff0 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
22000 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
22010 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
22020 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
22030 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  i==0 );.#ifndef 
22040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
22050 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57        selectPopW
22060 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b  ith(pWalker, p);
22070 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
22080 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
22090 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
220a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
220b0 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
220c0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
220d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
220e0 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
220f0 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
22100 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
22110 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
22120 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
22130 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22140 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
22150 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
22160 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
22170 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
22180 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
22190 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
221a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
221b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
221c0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
221d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
221e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
221f0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
22200 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
22210 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
22220 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
22230 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
22240 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
22250 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22260 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
22270 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
22280 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
22290 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
222a0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
222b0 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
222c0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
222d0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
222e0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
222f0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
22300 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
22310 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
22320 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
22330 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
22340 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
22350 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
22360 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
22370 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20  Est = 1048576;. 
22380 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
22390 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
223a0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
223b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
223c0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
223d0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
223e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
223f0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
22400 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
22410 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
22420 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
22430 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
22440 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
22450 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
22460 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
22470 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22480 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
22490 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
224a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
224b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
224c0 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
224d0 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
224e0 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
224f0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
22500 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
22510 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
22520 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
22530 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
22540 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
22550 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
22560 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
22570 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
22580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22590 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
225a0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
225b0 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
225c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
225d0 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
225e0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
225f0 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
22600 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
22610 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
22620 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
22630 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
22640 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22650 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22660 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
22670 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
22680 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
22690 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
226a0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
226b0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
226c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
226d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
226e0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
226f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
22700 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
22710 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
22720 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
22730 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
22740 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
22750 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
22760 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
22770 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
22780 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22790 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
227a0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
227b0 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
227c0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
227d0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
227e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
227f0 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
22800 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
22810 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
22820 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22830 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
22840 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
22850 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
22860 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
22870 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
22880 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
22890 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
228a0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
228b0 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
228c0 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
228d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
228e0 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
228f0 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
22900 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
22910 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
22920 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
22930 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
22940 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
22950 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
22960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
22970 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
22980 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
22990 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
229a0 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
229b0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
229c0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
229d0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
229e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
229f0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
22a00 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
22a10 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
22a20 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
22a30 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
22a40 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
22a50 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
22a60 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
22a70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
22a80 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
22a90 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
22aa0 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
22ab0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
22ac0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
22ad0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22ae0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
22af0 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
22b00 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
22b10 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
22b20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
22b30 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
22b40 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  ht->op==TK_ALL )
22b50 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
22b60 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
22b70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
22b80 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
22b90 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
22ba0 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
22bb0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
22bc0 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
22bd0 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
22be0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
22bf0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
22c00 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
22c10 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
22c20 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
22c30 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
22c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
22c50 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
22c60 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
22c70 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22c80 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
22c90 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
22ca0 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
22cb0 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
22cc0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
22cd0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cf0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
22d00 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
22d10 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
22d20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73    /* When proces
22d30 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65  sing FROM-clause
22d40 20 73 75 62 71 75 65 72 69 65 73 2c 20 69 74 20   subqueries, it 
22d50 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
22d60 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66  se.    ** that f
22d70 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
22d80 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63  =OFF and short_c
22d90 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20  olumn_names=ON. 
22da0 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   The.    ** sqli
22db0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
22dc0 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d  lect() routine m
22dd0 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20  akes it so. */. 
22de0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
22df0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
22e00 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20  tedFrom)==0.    
22e10 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
22e20 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
22e30 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20  lNames)==0 &&.  
22e40 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
22e50 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
22e60 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29  tColNames)!=0) )
22e70 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
22e80 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
22e90 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
22ea0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
22eb0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
22ec0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
22ed0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
22ee0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
22ef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
22f00 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
22f10 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
22f20 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
22f30 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
22f40 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
22f50 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
22f60 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
22f70 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
22f80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22f90 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
22fa0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
22fb0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
22fc0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
22fd0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
22fe0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
22ff0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
23000 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
23010 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
23020 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
23030 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
23040 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
23050 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
23060 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
23070 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
23080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
23090 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
230a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
230b0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
230c0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
230d0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
230e0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
230f0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
23100 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
23110 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
23120 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
23130 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
23140 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
23150 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
23160 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
23170 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
23180 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
23190 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
231a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
231b0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
231c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
231d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
231e0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
231f0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
23200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
23210 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
23220 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
23230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
23240 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
23250 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
23260 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
23270 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
23280 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
23290 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
232a0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
232b0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
232c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
232d0 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
232e0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
232f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
23300 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
23310 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
23320 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
23330 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
23340 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
23350 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
23360 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
23370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23380 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23390 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
233a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
233b0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
233c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
233d0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
233e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
233f0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
23400 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
23410 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
23420 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
23430 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23440 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
23450 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23460 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
23470 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
23480 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
23490 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
234a0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
234b0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
234c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a  aDb[iDb].zName :
234d0 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
234e0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
234f0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
23500 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
23510 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
23520 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
23530 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
23540 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
23550 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
23560 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
23570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23580 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
23590 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
235a0 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
235b0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
235c0 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
235d0 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
235e0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
235f0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
23600 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
23610 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
23620 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
23630 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
23640 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
23650 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
23660 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
23670 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
23680 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
23690 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
236a0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
236b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
236c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
236d0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
236e0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
236f0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
23700 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
23710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
23720 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
23730 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
23740 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
23750 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
23760 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
23770 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
23780 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
23790 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
237a0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
237b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
237c0 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
237d0 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
237e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
237f0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
23800 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
23810 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
23820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
23830 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
23840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23850 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
23860 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
23870 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
23880 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
23890 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
238a0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
238b0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
238c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
238d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
238e0 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
238f0 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
23900 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23920 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
23930 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
23940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
23950 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23970 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
23980 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
23990 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
239a0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239c0 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
239d0 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
239e0 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
239f0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
23a00 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
23a10 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
23a20 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
23a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23a70 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
23a80 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
23a90 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
23ab0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
23ac0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
23ad0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
23ae0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
23af0 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
23b00 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
23b10 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
23b20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
23b30 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
23b40 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
23b50 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
23b60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
23b70 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
23b80 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
23b90 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
23ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
23bb0 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
23bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23bd0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
23be0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
23bf0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23c10 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
23c20 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
23c30 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
23c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23c60 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
23c70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
23c80 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
23c90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
23ca0 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
23cb0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
23cd0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
23ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23cf0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
23d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23d10 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
23d20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
23d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
23d40 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
23d50 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
23d60 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
23d70 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
23d80 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
23d90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
23da0 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
23db0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
23dc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
23dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
23de0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
23df0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
23e00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
23e10 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
23e20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
23e30 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
23e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23e50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23e60 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
23e70 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
23e80 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
23e90 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23eb0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
23ec0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
23ed0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
23ee0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
23ef0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
23f00 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
23f10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
23f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23f30 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
23f40 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
23f50 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
23f60 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
23f90 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
23fa0 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
23fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fc0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
23fd0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
23fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23ff0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
24000 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
24010 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
24030 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
24040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24060 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
24070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
24080 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
24090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
240a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
240b0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
240c0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
240d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
240e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
240f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24100 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
24110 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
24120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24140 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
24150 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
24160 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
24170 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
24180 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
24190 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
241a0 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
241b0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
241c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
241d0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
241e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
241f0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
24200 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
24210 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
24220 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
24230 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
24240 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
24250 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
24260 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
24270 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
24280 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
24290 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
242a0 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
242b0 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
242c0 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
242d0 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
242e0 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
242f0 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
24300 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
24310 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
24320 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
24330 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
24340 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
24350 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
24360 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
24370 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
24380 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
24390 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
243a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
243b0 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
243c0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
243d0 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
243e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
243f0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
24400 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
24410 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
24420 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24430 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
24440 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24450 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
24460 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
24470 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
24480 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
24490 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
244a0 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
244b0 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
244c0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
244d0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
244e0 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
244f0 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
24500 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
24510 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
24520 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
24530 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
24540 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24550 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
24560 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
24570 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
24580 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
24590 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
245a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
245b0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
245c0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
245d0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
245e0 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
245f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
24600 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
24610 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
24620 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
24630 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
24640 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
24650 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
24660 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
24670 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
24680 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
24690 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
246a0 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
246b0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
246c0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
246d0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
246e0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
246f0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
24700 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
24710 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
24720 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
24730 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
24740 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
24750 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
24760 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
24770 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
24780 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
24790 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
247a0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
247b0 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
247c0 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  h;.  sqlite3Walk
247d0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
247e0 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
247f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
24800 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
24810 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
24820 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
24830 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
24840 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
24850 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
24860 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
24870 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
24880 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
24890 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
248a0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
248b0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
248c0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
248d0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
248e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
248f0 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
24900 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
24910 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
24920 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
24930 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
24940 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
24950 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
24960 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
24970 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
24980 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
24990 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
249a0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
249b0 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
249c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
249d0 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
249e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
249f0 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
24a00 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
24a10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
24a20 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
24a30 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
24a40 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
24a50 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
24a60 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
24a70 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
24a80 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
24a90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
24aa0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
24ab0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
24ac0 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
24ad0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24ae0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
24af0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  =0 ){.    p->sel
24b00 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
24b10 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61  ypeInfo;.    pPa
24b20 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24b30 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c  Parse;.    pTabL
24b40 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
24b50 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
24b60 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
24b70 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
24b80 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
24b90 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
24ba0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
24bb0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
24bc0 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70  S(pTab!=0) && (p
24bd0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
24be0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
24bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
24c00 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
24c10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
24c20 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
24c30 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
24c40 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
24c50 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ct;.        if( 
24c60 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
24c70 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
24c80 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
24c90 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
24ca0 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
24cb0 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
24cc0 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
24cd0 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
24ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24cf0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
24d00 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
24d10 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
24d20 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
24d30 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
24d40 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
24d50 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
24d60 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
24d70 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
24d80 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
24d90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
24da0 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
24db0 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
24dc0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
24dd0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
24de0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
24df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
24e00 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
24e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
24e30 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
24e40 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
24e50 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
24e60 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
24e70 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
24e80 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
24e90 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
24ea0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
24eb0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
24ec0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
24ed0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
24ee0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
24ef0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
24f00 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
24f10 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
24f20 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
24f30 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
24f40 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
24f50 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
24f60 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
24f70 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
24f80 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
24f90 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
24fa0 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
24fb0 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
24fc0 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
24fd0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
24fe0 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
24ff0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
25000 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
25010 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
25020 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
25030 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
25040 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
25050 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
25060 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
25070 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
25080 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
25090 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
250a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
250b0 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
250c0 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
250d0 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
250e0 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
250f0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
25100 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
25110 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
25120 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
25130 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
25140 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25150 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
25160 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
25170 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
25180 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
25190 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
251a0 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
251b0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
251c0 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
251d0 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
251e0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
251f0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
25200 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
25210 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
25220 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
25230 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
25240 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
25250 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
25260 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
25270 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
25280 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
25290 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
252a0 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
252b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
252c0 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
252d0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
252e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
252f0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
25300 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
25310 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
25320 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
25330 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
25340 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
25350 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
25360 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
25370 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
25380 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
25390 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
253a0 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
253b0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
253c0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
253d0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
253e0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
253f0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
25400 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
25410 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
25420 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
25430 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
25440 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
25450 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
25460 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
25470 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
25480 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
25490 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
254a0 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
254b0 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
254c0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
254d0 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
254e0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
254f0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
25500 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
25510 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
25520 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
25530 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
25540 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
25550 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
25560 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
25570 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
25580 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
25590 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
255a0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
255b0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
255c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
255d0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
255e0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
255f0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
25600 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
25610 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
25620 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
25630 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
25640 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
25650 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
25660 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
25670 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
25680 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
25690 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
256a0 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
256b0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
256c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
256d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
256e0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
256f0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
25700 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
25710 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
25720 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
25730 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
25740 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
25750 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
25760 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
25770 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
25780 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
25790 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
257a0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
257b0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
257c0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
257d0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
257e0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
257f0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
25800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
25810 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25820 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
25830 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
25840 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
25850 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
25860 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
25870 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
25880 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
25890 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
258a0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
258b0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
258c0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
258d0 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ist, 0);.       
258e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
258f0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
25900 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
25910 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
25940 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
25950 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
25960 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
25970 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
25980 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
25990 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
259a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
259b0 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
259c0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
259d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
259e0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
259f0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
25a00 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
25a10 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
25a20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25a30 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
25a40 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
25a50 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
25a60 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
25a70 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
25a80 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
25a90 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
25aa0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
25ab0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
25ac0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
25ad0 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
25ae0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25af0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
25b00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
25b10 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
25b20 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
25b30 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
25b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25b50 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
25b60 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
25b70 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
25b80 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
25b90 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
25ba0 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
25bb0 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
25bc0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
25bd0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
25be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25bf0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
25c00 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
25c10 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
25c20 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
25c30 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
25c40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
25c50 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
25c60 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
25c70 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
25c80 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
25c90 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
25ca0 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
25cb0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
25cc0 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
25cd0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
25ce0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
25cf0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
25d00 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
25d10 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
25d20 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
25d30 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
25d40 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
25d50 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
25d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25d70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
25d80 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
25d90 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
25da0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
25db0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
25dc0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
25dd0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
25de0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
25df0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
25e00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
25e10 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
25e20 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c  ist, regAgg, SQL
25e30 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
25e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e50 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
25e60 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
25e70 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
25e80 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
25e90 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
25ea0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
25eb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
25ec0 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
25ed0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
25ee0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
25ef0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
25f00 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
25f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25f20 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
25f30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
25f40 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
25f50 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
25f60 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
25f70 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
25f80 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
25f90 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
25fa0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
25fb0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
25fc0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
25fd0 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
25fe0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
25ff0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
26000 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
26010 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
26020 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
26030 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
26040 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
26050 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
26060 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
26070 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
26080 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
26090 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
260a0 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
260b0 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
260c0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
260d0 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
260e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
260f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26100 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
26110 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
26120 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
26130 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
26140 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26150 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
26160 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
26170 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
261a0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
261b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
261c0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
261d0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
261e0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
261f0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
26200 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
26210 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
26220 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
26230 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
26240 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
26250 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
26260 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26270 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
26280 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26290 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
262a0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
262b0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
262c0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
262d0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
262e0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
262f0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
26300 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
26310 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
26320 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
26330 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
26340 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
26350 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
26360 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
26370 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
26380 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
26390 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
263a0 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
263b0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
263c0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
263d0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
263e0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
263f0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
26400 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
26410 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
26420 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
26430 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
26440 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
26450 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
26460 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
26470 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
26480 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
26490 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
264a0 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
264b0 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
264c0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
264d0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
264e0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
264f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
26500 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
26510 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
26520 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26530 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
26540 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
26550 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
26560 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
26570 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
26580 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
26590 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
265a0 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
265b0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
265c0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
265d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
265e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
265f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
26600 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
26610 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
26620 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
26630 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
26640 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
26650 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
26660 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
26670 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
26680 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
26690 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
266a0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
266b0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
266c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
266d0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
266e0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
266f0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
26700 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
26710 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
26720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
26730 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26750 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
26760 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
26770 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
26780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26790 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
267a0 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
267b0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
267c0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
267d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
267e0 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
267f0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
26800 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
26810 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
26820 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
26830 20 20 20 70 49 64 78 20 3f 20 22 20 55 53 49 4e     pIdx ? " USIN
26840 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
26850 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
26860 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e   pIdx ? pIdx->zN
26870 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
26880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26890 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
268a0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
268b0 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
268c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
268d0 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
268e0 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
268f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
26900 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
26910 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
26920 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26930 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
26940 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
26950 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
26960 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
26970 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
26980 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
26990 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
269a0 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
269b0 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
269c0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
269d0 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
269e0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
269f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
26a00 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
26a10 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
26a20 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
26a30 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
26a40 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
26a50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
26a60 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
26a70 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
26a80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26a90 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
26aa0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
26ab0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
26ac0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
26ad0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
26ae0 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
26af0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
26b00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
26b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26b20 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
26b30 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
26b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26b50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26b60 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
26b70 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
26b80 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
26b90 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
26ba0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
26bb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
26bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26bd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
26be0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
26bf0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
26c00 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
26c10 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
26c20 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
26c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26c40 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
26c50 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
26c60 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
26c70 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
26c80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
26c90 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
26ca0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
26cb0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
26cc0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
26cd0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
26ce0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
26cf0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
26d00 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
26d10 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
26d20 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
26d30 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
26d40 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26d50 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
26d60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
26d70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
26d80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
26d90 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
26da0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
26db0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
26dc0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
26dd0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
26de0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
26df0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
26e00 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
26e10 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
26e20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
26e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26e40 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
26e50 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
26e60 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
26e70 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
26e80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
26e90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
26ea0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
26eb0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
26ec0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
26ed0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
26ee0 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
26ef0 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66  word */.  AggInf
26f00 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
26f10 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
26f20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
26f30 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
26f40 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
26f50 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
26f60 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
26f70 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
26f80 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
26f90 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
26fa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
26fb0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
26fc0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
26fd0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
26fe0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
26ff0 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
27000 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
27010 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
27020 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
27030 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
27040 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
27050 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
27060 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
27070 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
27080 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
27090 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
270a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
270b0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
270c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
270d0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
270e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
270f0 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67  nfo));..  if( Ig
27100 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
27110 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
27120 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
27130 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
27140 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
27150 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
27160 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
27170 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
27180 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
27190 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
271a0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
271b0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
271c0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
271d0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
271e0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
271f0 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
27200 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
27210 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
27220 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
27230 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
27240 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
27250 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
27260 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
27270 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
27280 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
27290 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f  rse, p, 0);.  pO
272a0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
272b0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
272c0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
272d0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
272e0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
272f0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
27300 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
27310 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
27320 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28  .  }.  isAgg = (
27330 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27340 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
27350 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
27360 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  !=0 );..  /* Beg
27370 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
27380 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
27390 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
273a0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
273b0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
273c0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
273d0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
273e0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
273f0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
27400 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
27410 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
27420 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27430 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
27440 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
27450 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
27460 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
27470 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
27480 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
27490 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
274a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
274b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
274c0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
274d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
274e0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
274f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
27500 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
27510 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
27520 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
27530 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
27540 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
27550 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
27560 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27570 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
27580 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
27590 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
275a0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
275b0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
275c0 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
275d0 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62  b;..    if( pSub
275e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
275f0 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
27600 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
27610 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
27620 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
27630 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
27640 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
27650 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
27660 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
27670 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
27680 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
27690 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
276a0 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
276b0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
276c0 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
276d0 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
276e0 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
276f0 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
27700 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
27710 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
27720 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
27730 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
27740 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
27750 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
27760 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
27770 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
27780 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
27790 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
277a0 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f  if( pItem->viaCo
277b0 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
277c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
277d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
277e0 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
277f0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
27800 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
27810 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
27820 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
27830 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
27840 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
27850 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
27860 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
27870 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
27880 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
27890 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
278a0 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
278b0 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
278c0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
278d0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
278e0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
278f0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
27900 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
27910 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
27920 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
27930 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
27940 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
27950 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
27960 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
27970 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
27980 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
27990 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
279a0 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
279b0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
279c0 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  ;..    isAggSub 
279d0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
279e0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
279f0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
27a00 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
27a10 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
27a20 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
27a30 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
27a40 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
27a50 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
27a60 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
27a70 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
27a80 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
27a90 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
27aa0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
27ab0 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
27ac0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
27ad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
27ae0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
27af0 20 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74            && Opt
27b00 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
27b10 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
27b20 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29  Coroutine).    )
27b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65  {.      /* Imple
27b40 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ment a co-routin
27b50 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75  e that will retu
27b60 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
27b70 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
27b80 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61      ** set on ea
27b90 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  ch invocation.. 
27ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
27bb0 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69  t addrTop = sqli
27bc0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
27bd0 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70  dr(v)+1;.      p
27be0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
27bf0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
27c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27c10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
27c20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
27c30 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
27c40 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
27c50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
27c60 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
27c70 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
27c80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
27c90 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
27ca0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
27cb0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
27cc0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
27cd0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
27ce0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
27cf0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
27d00 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
27d10 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
27d20 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
27d30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
27d40 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
27d50 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
27d60 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
27d70 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
27d80 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
27d90 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
27da0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
27db0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
27dc0 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
27dd0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
27de0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
27df0 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
27e00 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
27e10 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
27e20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27e30 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
27e40 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
27e50 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
27e60 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
27e70 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
27e80 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
27e90 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
27ea0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
27eb0 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
27ec0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
27ed0 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
27ee0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
27ef0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
27f00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
27f10 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
27f20 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
27f30 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
27f40 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
27f50 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
27f60 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
27f70 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
27f80 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
27f90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
27fa0 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
27fb0 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
27fc0 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
27fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27fe0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
27ff0 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
28000 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
28010 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
28020 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
28030 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
28040 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
28050 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
28060 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
28070 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
28080 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
28090 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
280a0 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
280b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
280c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
280d0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
280e0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
280f0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
28100 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
28110 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
28120 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
28130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
28140 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
28150 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
28160 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
28170 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
28180 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
28190 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
281a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
281b0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
281c0 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
281d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
281e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
281f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
28200 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
28210 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
28220 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
28230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28240 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
28250 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
28260 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
28270 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
28280 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
28290 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
282a0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
282b0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
282c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
282d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
282e0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
282f0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
28300 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  nRowEst = (unsig
28310 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63  ned)pSub->nSelec
28320 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
28330 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
28340 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28350 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
28360 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
28370 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28380 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
28390 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
283a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
283b0 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
283c0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
283d0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
283e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
283f0 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
28400 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
28410 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
28420 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
28430 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
28440 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
28450 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28460 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
28470 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
28480 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
28490 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
284a0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
284b0 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
284c0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
284d0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
284e0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
284f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
28500 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
28510 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
28520 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
28530 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
28540 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
28550 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
28560 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
28570 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
28580 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
28590 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
285a0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
285b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
285c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
285d0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
285e0 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
285f0 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
28600 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
28610 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
28620 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
28630 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
28640 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
28650 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
28660 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
28670 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
28680 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
28690 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65  electId);.    re
286a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
286b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
286c0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
286d0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
286e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
286f0 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69   they are.  ** i
28700 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64  dentical, then d
28710 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
28720 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65   BY clause since
28730 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20   the GROUP BY.  
28740 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  ** will cause el
28750 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
28760 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ut in the correc
28770 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  t order.  This i
28780 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69  s.  ** an optimi
28790 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
287a0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
287b0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
287c0 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74  less..  ** Use t
287d0 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
287e0 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
287f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
28800 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20  _OPTIMIZER.  ** 
28810 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  to disable this 
28820 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
28830 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
28840 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
28850 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
28860 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  pare(p->pGroupBy
28870 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  , pOrderBy, -1)=
28880 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  =0.         && O
28890 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
288a0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
288b0 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b 0a 20  oupByOrder) ){. 
288c0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
288d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
288e0 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
288f0 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
28900 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
28910 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
28920 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
28930 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
28940 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
28950 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
28960 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
28970 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
28980 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
28990 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
289a0 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
289b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
289c0 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
289d0 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
289e0 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
289f0 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
28a00 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
28a10 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
28a20 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a  ROUP BY xyz.  **
28a30 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
28a40 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
28a50 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
28a60 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
28a70 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
28a80 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
28a90 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
28aa0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
28ab0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
28ac0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
28ad0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
28ae0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
28af0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
28b00 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
28b10 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
28b20 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
28b30 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
28b40 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
28b50 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
28b60 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
28b70 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
28b80 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
28b90 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
28ba0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
28bb0 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65  istCompare(pOrde
28bc0 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  rBy, p->pEList, 
28bd0 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
28be0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
28bf0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
28c00 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
28c10 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
28c20 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
28c30 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
28c40 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
28c50 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
28c60 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  0;.    /* Notice
28c70 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
28c80 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
28c90 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
28ca0 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
28cb0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
28cc0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
28cd0 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
28ce0 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
28cf0 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
28d00 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
28d10 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
28d20 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
28d30 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
28d40 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
28d50 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
28d60 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
28d70 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
28d80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
28d90 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
28da0 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
28db0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
28dc0 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
28dd0 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
28de0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
28df0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
28e00 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
28e10 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
28e20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
28e30 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
28e40 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
28e50 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
28e60 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
28e70 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
28e80 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
28e90 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
28ea0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
28eb0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
28ec0 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
28ed0 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
28ee0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
28ef0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
28f00 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
28f10 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
28f20 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
28f30 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
28f40 79 2c 20 30 29 3b 0a 20 20 20 20 70 4f 72 64 65  y, 0);.    pOrde
28f50 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
28f60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
28f70 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
28f80 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
28f90 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
28fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28fb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
28fc0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
28ff0 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
29000 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
29030 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
29040 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  O);.  }else{.   
29050 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
29060 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
29070 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
29080 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
29090 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
290a0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
290b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
290c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
290d0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
290e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
290f0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
29100 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
29110 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
29120 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
29130 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
29140 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
29150 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
29160 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
29170 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
29180 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
29190 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
291a0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
291b0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
291c0 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
291d0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
291e0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
291f0 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
29200 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
29210 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
29220 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
29230 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
29240 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
29250 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
29260 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
29270 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
29280 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
29290 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
292a0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
292b0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
292c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
292d0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
292e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
292f0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
29300 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
29330 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
29340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
29370 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29380 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  rse, p->pEList, 
29390 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293b0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
293c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
293d0 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
293e0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
293f0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
29400 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
29410 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
29420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
29430 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
29440 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
29450 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
29460 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
29470 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
29480 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
29490 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
294a0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
294b0 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
294c0 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
294d0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
294e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
294f0 43 54 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  CT : 0);.    int
29500 20 6e 4f 42 53 61 74 3b 0a 0a 20 20 20 20 2f 2a   nOBSat;..    /*
29510 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
29520 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
29530 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
29540 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
29550 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
29560 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  here, pOrderBy, 
29570 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20 20  p->pEList,.     
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46            wctrlF
295a0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
295b0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
295c0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
295d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
295e0 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
295f0 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e  t(pWInfo) < p->n
29600 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
29610 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
29620 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
29630 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
29640 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
29650 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69   if( sDistinct.i
29660 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33  sTnct && sqlite3
29670 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
29680 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
29690 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
296a0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68  Type = sqlite3Wh
296b0 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
296c0 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
296d0 20 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65   nOBSat = sqlite
296e0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
296f0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  pWInfo);.    if(
29700 20 70 4f 72 64 65 72 42 79 20 26 26 20 6e 4f 42   pOrderBy && nOB
29710 53 61 74 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  Sat==pOrderBy->n
29720 45 78 70 72 20 29 7b 20 70 4f 72 64 65 72 42 79  Expr ){ pOrderBy
29730 20 3d 20 30 3b 20 20 6e 4f 42 53 61 74 20 3d 20   = 0;  nOBSat = 
29740 30 3b 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20  0; }..    /* If 
29750 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
29760 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
29770 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
29780 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
29790 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
297a0 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
297b0 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
297c0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
297d0 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
297e0 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
297f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
29800 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  ( addrSortIndex>
29810 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
29820 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
29830 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
29840 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  op(v, addrSortIn
29850 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  dex);.      p->a
29860 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
29870 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
29880 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
29890 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
298a0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
298b0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
298c0 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f  , pEList, -1, pO
298d0 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 20  rderBy, nOBSat, 
298e0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
298f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
29900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
29910 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
29920 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
29940 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
29950 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
29960 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
29970 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
29980 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
29990 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
299a0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
299b0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
299c0 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
299d0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
299e0 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
299f0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
29a00 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
29a10 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
29a20 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
29a30 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
29a40 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
29a50 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
29a60 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
29a70 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
29a80 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
29a90 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
29aa0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
29ab0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
29ac0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
29ad0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
29ae0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
29af0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
29b00 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
29b10 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
29b20 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
29b30 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
29b60 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
29b70 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
29b80 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
29bb0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
29bc0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
29bd0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
29be0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
29bf0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
29c00 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
29c10 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
29c20 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
29c30 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
29c40 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
29c50 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
29c60 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
29c70 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
29c80 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
29c90 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
29ca0 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
29cb0 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
29cc0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
29cd0 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
29ce0 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
29cf0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
29d00 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20  e sorter */..   
29d10 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
29d20 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
29d30 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
29d40 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
29d50 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
29d60 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
29d70 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
29d80 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29db0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
29dc0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
29dd0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
29de0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
29df0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
29e00 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
29e10 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
29e20 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
29e30 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
29e40 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
29e50 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
29e60 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
29e70 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
29e80 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
29e90 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
29ea0 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
29eb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
29ec0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
29ed0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
29ee0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
29ef0 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70  electRow>100 ) p
29f00 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
29f10 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  00;.    }else{. 
29f20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
29f30 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 1;.    }.. 
29f40 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
29f50 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
29f60 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
29f70 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
29f80 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
29f90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29fa0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
29fb0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
29fc0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
29fd0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
29fe0 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
29ff0 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
2a000 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
2a010 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
2a020 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
2a030 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
2a040 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2a050 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
2a060 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
2a070 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
2a080 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2a090 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
2a0a0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2a0b0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
2a0c0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
2a0d0 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
2a0e0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2a0f0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
2a100 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
2a110 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
2a120 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
2a130 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
2a140 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2a150 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
2a160 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2a170 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
2a180 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2a190 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2a1a0 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  sNC, pOrderBy);.
2a1b0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
2a1c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a1d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a1e0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
2a1f0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
2a200 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
2a210 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
2a220 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
2a230 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2a240 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
2a250 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2a260 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
2a270 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
2a280 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2a290 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
2a2a0 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
2a2b0 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
2a2c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2a2d0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2a2e0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
2a2f0 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
2a300 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
2a310 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
2a320 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
2a330 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
2a340 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
2a350 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2a360 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2a370 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
2a380 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
2a390 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
2a3a0 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
2a3b0 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
2a3c0 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
2a3d0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
2a3e0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
2a3f0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
2a400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2a410 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2a420 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2a430 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
2a440 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2a450 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
2a460 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
2a470 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
2a480 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
2a490 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
2a4a0 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
2a4b0 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
2a4c0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
2a4d0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
2a4e0 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
2a4f0 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
2a500 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
2a510 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2a520 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
2a530 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
2a540 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
2a550 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
2a560 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
2a570 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
2a580 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
2a590 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
2a5a0 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
2a5b0 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
2a5c0 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
2a5d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2a5e0 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
2a5f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
2a600 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
2a610 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
2a620 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
2a630 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
2a640 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
2a650 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
2a660 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
2a670 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
2a680 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
2a690 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
2a6a0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
2a6b0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
2a6c0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
2a6d0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
2a6e0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
2a6f0 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
2a700 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
2a710 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
2a720 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
2a730 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
2a740 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
2a750 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
2a760 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
2a770 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
2a780 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
2a790 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
2a7a0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2a7b0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
2a7c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2a7d0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2a7e0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2a7f0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2a800 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53   0);.      addrS
2a810 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
2a820 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a830 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
2a840 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2a850 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2a860 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2a870 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
2a880 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
2a890 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2a8a0 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
2a8b0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
2a8c0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
2a8d0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
2a8e0 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
2a8f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a900 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
2a910 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a920 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
2a930 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a940 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
2a950 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2a960 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
2a970 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2a980 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2a990 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
2a9a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2a9b0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
2a9c0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
2a9d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2a9e0 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
2a9f0 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2aa00 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2aa10 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2aa20 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
2aa30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2aa40 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2aa50 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2aa60 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2aa70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2aa80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2aa90 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
2aaa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2aab0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
2aac0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2aad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2aae0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2aaf0 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
2ab00 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2ab10 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
2ab20 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2ab30 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
2ab40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ab50 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2ab60 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
2ab70 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
2ab80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
2ab90 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
2aba0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
2abb0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
2abc0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
2abd0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2abe0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
2abf0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
2ac00 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
2ac10 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
2ac20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2ac30 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
2ac40 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2ac50 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
2ac60 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
2ac70 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
2ac80 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
2ac90 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
2aca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2acb0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2acc0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2acd0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
2ace0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2acf0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2ad00 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2ad10 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
2ad20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c    WHERE_GROUPBY,
2ad50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2ad60 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2ad70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ad80 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2ad90 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2ada0 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2adb0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2adc0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2add0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2ade0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2adf0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2ae00 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2ae10 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2ae20 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2ae30 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2ae40 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2ae50 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2ae60 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2ae70 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2ae80 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2ae90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2aea0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2aeb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aec0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2aed0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2aee0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2aef0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2af00 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2af10 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2af20 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2af30 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2af40 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2af50 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2af60 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2af70 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2af80 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2af90 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2afa0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2afb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2afc0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2afd0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2afe0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2aff0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2b000 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2b010 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2b020 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2b030 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2b040 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2b050 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2b060 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2b080 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2b090 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2b0a0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2b0b0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2b0c0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2b0d0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2b0e0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
2b0f0 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
2b100 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
2b110 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2b120 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2b130 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2b140 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2b150 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2b160 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2b170 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2b180 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2b190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2b1b0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2b1c0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2b1d0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2b1e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2b1f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2b200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b210 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2b220 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2b230 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
2b240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b260 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
2b270 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
2b280 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
2b290 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2b2a0 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
2b2b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2b2c0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2b2d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2b2e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2b2f0 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
2b300 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
2b310 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2b320 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2b330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b340 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
2b350 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
2b360 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
2b370 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
2b380 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
2b390 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2b3c0 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
2b3d0 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
2b3e0 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
2b3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
2b400 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
2b410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
2b430 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
2b440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b450 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2b460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b470 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
2b480 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
2b490 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2b4a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b4b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2b4c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
2b4d0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
2b4e0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2b4f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b500 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
2b510 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
2b520 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
2b530 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2b540 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2b550 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
2b560 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2b570 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2b580 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2b590 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
2b5a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b5b0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2b5c0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2b5d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
2b5e0 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
2b5f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2b600 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
2b610 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2b620 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2b630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b640 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
2b650 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
2b660 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
2b670 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b690 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
2b6a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2b6b0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
2b6c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2b6d0 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
2b6e0 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
2b6f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2b700 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
2b710 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
2b720 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b730 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b740 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
2b750 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
2b760 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2b770 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
2b780 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
2b790 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
2b7a0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
2b7b0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
2b7c0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
2b7d0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
2b7e0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
2b7f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2b800 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
2b810 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
2b820 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
2b830 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
2b840 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
2b850 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
2b860 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
2b870 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
2b880 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2b890 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2b8a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b8b0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2b8c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
2b8d0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2b8e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b8f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b900 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
2b910 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b920 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  , sortOut);.    
2b930 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2b940 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
2b950 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2b960 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2b970 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
2b980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b990 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2b9a0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
2b9b0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2b9c0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c    if( j==0 ) sql
2b9d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2b9e0 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
2b9f0 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
2ba00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ba10 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
2ba20 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
2ba30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2ba40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
2ba50 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
2ba60 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2ba70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ba80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ba90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
2baa0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
2bab0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2bac0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2bae0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
2baf0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
2bb00 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2bb10 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
2bb20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2bb30 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2bb40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2bb50 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
2bb60 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  , j1+1); VdbeCov
2bb70 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
2bb80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2bb90 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
2bba0 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
2bbb0 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
2bbc0 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
2bbd0 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
2bbe0 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
2bbf0 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
2bc00 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
2bc10 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
2bc20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
2bc30 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
2bc40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bc50 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
2bc60 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
2bc70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
2bc80 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
2bc90 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
2bca0 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
2bcb0 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
2bcc0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
2bcd0 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
2bce0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2bcf0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2bd00 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
2bd10 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2bd20 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
2bd30 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
2bd40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2bd50 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
2bd60 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
2bd70 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
2bd80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bd90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2bda0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2bdb0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2bdc0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2bdd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2bde0 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
2bdf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2be00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
2be10 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
2be20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
2be30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2be40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2be50 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
2be60 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2be70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2be80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2be90 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2bea0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2beb0 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
2bec0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2bed0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2bee0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2bef0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
2bf00 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
2bf10 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2bf20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
2bf30 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2bf40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2bf50 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
2bf60 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
2bf70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2bf80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bf90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2bfa0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
2bfb0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2bfc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2bfd0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
2bfe0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2bff0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
2c000 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
2c010 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
2c020 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2c030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2c050 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
2c060 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2c070 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
2c080 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2c090 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
2c0a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2c0b0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2c0c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2c0d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2c0e0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
2c0f0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
2c100 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
2c110 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
2c120 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
2c130 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2c140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2c150 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2c160 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2c170 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2c180 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2c190 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
2c1a0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
2c1b0 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
2c1c0 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
2c1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2c1f0 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  , 0, addrEnd);..
2c200 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2c210 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2c220 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
2c230 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2c240 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2c250 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
2c260 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
2c270 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
2c280 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
2c290 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
2c2a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2c2b0 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
2c2c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2c2d0 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
2c2e0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
2c2f0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
2c300 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
2c310 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
2c320 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
2c330 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
2c340 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2c350 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2c360 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
2c370 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
2c380 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
2c390 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c3a0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
2c3b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2c3c0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2c3d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c3e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2c3f0 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
2c400 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2c410 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
2c420 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2c430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c440 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2c450 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2c460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c470 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2c480 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2c490 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
2c4a0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
2c4b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2c4c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c4d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c4e0 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
2c4f0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2c500 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
2c510 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2c520 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
2c530 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
2c540 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
2c550 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2c560 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2c570 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2c580 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2c590 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2c5a0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
2c5b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2c5c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2c5d0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
2c5e0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2c5f0 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
2c600 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2c610 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2c620 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2c630 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72 42 79  st, -1, pOrderBy
2c640 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2c650 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
2c660 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c680 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2c690 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
2c6a0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2c6b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2c6c0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2c6d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2c6e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c6f0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
2c700 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
2c710 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2c720 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2c730 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
2c740 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
2c750 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
2c760 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2c770 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c780 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
2c790 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2c7a0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2c7b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2c7c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c7d0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2c7e0 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
2c7f0 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
2c800 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
2c810 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
2c820 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
2c830 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
2c840 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
2c850 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
2c860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c870 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
2c880 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
2c890 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
2c8a0 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
2c8b0 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
2c8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2c8d0 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
2c8e0 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
2c8f0 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
2c900 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
2c910 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
2c920 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
2c930 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
2c940 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c950 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
2c960 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
2c970 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c980 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
2c990 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2c9a0 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
2c9b0 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
2c9c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c9d0 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
2c9e0 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
2c9f0 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
2ca00 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
2ca10 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
2ca20 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
2ca30 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
2ca40 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
2ca50 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
2ca60 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2ca70 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
2ca80 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
2ca90 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
2caa0 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
2cab0 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
2cac0 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
2cad0 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
2cae0 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
2caf0 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
2cb00 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
2cb10 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
2cb20 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
2cb30 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2cb40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2cb50 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
2cb60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2cb70 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2cb80 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
2cb90 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
2cba0 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
2cbb0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
2cbc0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
2cbd0 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
2cbe0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2cbf0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc10 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2cc20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
2cc30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2cc40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cc50 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
2cc60 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
2cc70 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2cc80 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cca0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
2ccb0 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
2ccc0 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
2ccd0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
2cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2ccf0 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
2cd00 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
2cd10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
2cd20 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2cd30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
2cd40 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2cd50 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2cd60 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2cd70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
2cd80 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2cd90 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
2cda0 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
2cdb0 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
2cdc0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2cdd0 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
2cde0 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
2cdf0 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
2ce00 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
2ce10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2ce20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
2ce30 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
2ce40 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
2ce50 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
2ce60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2ce70 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
2ce80 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
2ce90 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
2cea0 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
2ceb0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
2cec0 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
2ced0 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
2cee0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2cef0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2cf00 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
2cf10 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2cf20 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2cf30 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
2cf40 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2cf50 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
2cf60 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
2cf70 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
2cf80 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2cf90 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
2cfa0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
2cfb0 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
2cfc0 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
2cfd0 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
2cfe0 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
2cff0 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
2d000 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
2d010 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
2d020 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
2d030 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
2d040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d050 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
2d060 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2d070 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
2d080 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
2d090 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2d0a0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
2d0b0 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
2d0c0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2d0d0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
2d0e0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
2d0f0 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
2d100 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
2d110 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
2d120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d130 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
2d140 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
2d150 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
2d160 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
2d170 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
2d180 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d190 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
2d1a0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2d1b0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
2d1c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2d1d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d1e0 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
2d1f0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
2d200 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
2d210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d220 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2d230 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
2d240 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2d250 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
2d260 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
2d270 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
2d280 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
2d290 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
2d2a0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2d2b0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
2d2c0 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
2d2d0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
2d2e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2d2f0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2d300 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
2d310 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2d320 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
2d330 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
2d340 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
2d350 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
2d360 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
2d370 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
2d380 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
2d390 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
2d3a0 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
2d3b0 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
2d3c0 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
2d3d0 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
2d3e0 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
2d3f0 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
2d400 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
2d410 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
2d420 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
2d430 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
2d440 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
2d450 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
2d460 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
2d470 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
2d480 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
2d490 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
2d4a0 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
2d4b0 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
2d4c0 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
2d4d0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
2d4e0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
2d4f0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
2d500 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
2d510 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
2d520 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
2d530 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
2d540 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
2d550 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
2d560 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2d570 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
2d580 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
2d590 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
2d5a0 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
2d5b0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
2d5c0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
2d5d0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
2d5e0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
2d5f0 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
2d600 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
2d610 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
2d620 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
2d630 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
2d640 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
2d650 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
2d660 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2d670 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
2d680 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
2d690 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
2d6a0 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
2d6b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2d6c0 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
2d6d0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
2d6e0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
2d6f0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
2d700 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
2d710 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
2d720 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
2d730 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
2d740 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
2d750 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
2d760 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
2d770 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
2d780 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
2d790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d7a0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2d7b0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
2d7c0 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
2d7d0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
2d7e0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2d7f0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
2d800 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
2d810 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2d820 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2d830 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
2d840 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
2d850 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
2d860 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
2d870 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
2d880 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2d890 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
2d8a0 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
2d8b0 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
2d8c0 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
2d8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
2d8e0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
2d8f0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2d900 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
2d910 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
2d920 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
2d930 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
2d940 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d960 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
2d970 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
2d980 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2d990 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
2d9a0 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2d9b0 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
2d9c0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2d9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d9e0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
2d9f0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
2da00 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
2da10 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2da20 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
2da30 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
2da40 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
2da50 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
2da60 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
2da70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
2da80 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
2da90 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
2daa0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2dab0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2dac0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
2dad0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2dae0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2daf0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
2db00 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
2db10 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
2db20 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
2db30 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2db40 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
2db50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2db60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2db70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2db80 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2db90 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2dba0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
2dbb0 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
2dbc0 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
2dbd0 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
2dbe0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2dbf0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2dc00 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o)>0 ){.        
2dc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2dc20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2dc30 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  0, sqlite3WhereB
2dc40 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2dc50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
2dc60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2dc70 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
2dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2dc90 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
2dca0 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
2dcb0 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
2dcc0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2dcd0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2dce0 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
2dcf0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2dd00 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2dd10 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
2dd20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
2dd30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2dd40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2dd50 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
2dd60 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
2dd70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2dd80 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2dd90 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2dda0 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  st, -1, 0, 0, 0,
2ddb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ddc0 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
2ddd0 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
2dde0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2ddf0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2de00 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
2de10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2de20 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2de30 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
2de40 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
2de50 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
2de60 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
2de70 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
2de80 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2de90 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
2dea0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2deb0 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
2dec0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2ded0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2dee0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
2def0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
2df00 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
2df10 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
2df20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
2df30 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
2df40 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
2df50 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2df60 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52  able(pParse, "OR
2df70 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
2df80 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
2df90 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
2dfa0 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
2dfb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
2dfc0 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
2dfd0 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
2dfe0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2dff0 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
2e000 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
2e010 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
2e020 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
2e030 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2e040 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
2e050 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
2e060 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
2e070 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
2e080 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
2e090 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
2e0a0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
2e0b0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
2e0c0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
2e0d0 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
2e0e0 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
2e0f0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2e100 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2e110 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2e120 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
2e130 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
2e140 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
2e150 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
2e160 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
2e170 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2e180 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
2e190 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
2e1a0 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
2e1b0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
2e1c0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2e1d0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
2e1e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2e1f0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
2e200 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2e210 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2e220 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
2e230 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
2e240 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2e250 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
2e260 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
2e270 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
2e280 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
2e290 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
2e2a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2e2b0 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65  d explainOneSele
2e2c0 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
2e2d0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71  Select *p){.  sq
2e2e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e2f0 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43  tf(pVdbe, "SELEC
2e300 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  T ");.  if( p->s
2e310 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2e320 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2e330 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ate) ){.    if( 
2e340 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2e350 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2e360 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e370 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e380 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20  DISTINCT ");.   
2e390 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65   }.    if( p->se
2e3a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2e3b0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  egate ){.      s
2e3c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e3d0 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f  ntf(pVdbe, "agg_
2e3e0 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20  flag ");.    }. 
2e3f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e400 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2e410 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e420 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20  intf(pVdbe, "   
2e430 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
2e440 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2e450 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73  (pVdbe, p->pELis
2e460 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
2e470 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e480 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
2e490 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  p->pSrc->nSrc ){
2e4a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2e4b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e4c0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f  intf(pVdbe, "FRO
2e4d0 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  M ");.    sqlite
2e4e0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2e4f0 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  be);.    for(i=0
2e500 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
2e510 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2e520 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2e530 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
2e540 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
2e550 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e560 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b  Printf(pVdbe, "{
2e570 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d  %d,*} = ", pItem
2e580 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2e590 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2e5a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2e5b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2e5c0 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65  lect(pVdbe, pIte
2e5d0 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
2e5e0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2e5f0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
2e600 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e610 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2e620 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70  (tabname=%s)", p
2e630 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2e640 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2e650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
2e660 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
2e670 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e680 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e690 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  , "%s", pItem->z
2e6a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
2e6b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2e6c0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
2e6d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e6e0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2e6f0 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
2e700 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
2e710 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2e720 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
2e730 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20  _LEFT ){.       
2e740 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e750 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c  rintf(pVdbe, " L
2e760 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
2e770 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2e780 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2e7a0 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
2e7b0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2e7c0 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
2e7d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e7e0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57  Printf(pVdbe, "W
2e7f0 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c  HERE ");.    sql
2e800 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2e810 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65  pVdbe, p->pWhere
2e820 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e830 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2e840 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
2e850 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
2e860 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2e870 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42  f(pVdbe, "GROUPB
2e880 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2e890 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2e8a0 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75  (pVdbe, p->pGrou
2e8b0 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
2e8c0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e8d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2e8e0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
2e8f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e900 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49  ntf(pVdbe, "HAVI
2e910 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  NG ");.    sqlit
2e920 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2e930 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  dbe, p->pHaving)
2e940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e950 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e960 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
2e970 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
2e980 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e990 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59  (pVdbe, "ORDERBY
2e9a0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e9b0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2e9c0 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72  pVdbe, p->pOrder
2e9d0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2e9e0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2e9f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2ea00 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
2ea10 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2ea20 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20  f(pVdbe, "LIMIT 
2ea30 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2ea40 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
2ea50 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
2ea60 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ea70 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2ea80 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
2ea90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2eaa0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2eab0 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20  e, "OFFSET ");. 
2eac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ead0 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2eae0 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  pOffset);.    sq
2eaf0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2eb00 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  Vdbe);.  }.}.voi
2eb10 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
2eb20 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2eb30 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2eb40 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2eb50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2eb60 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28  Printf(pVdbe, "(
2eb70 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a  null-select)");.
2eb80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2eb90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2eba0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
2ebb0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
2ebc0 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
2ebd0 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
2ebe0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
2ebf0 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
2ec00 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
2ec10 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2ec20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ec30 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ec40 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
2ec50 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
2ec60 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2ec70 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ec80 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
2ec90 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
2eca0 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
2ecb0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
2ecc0 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
2ecd0 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
2ece0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ecf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed20 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
2ed30 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2ed40 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
2ed50 2a 2f 0a                                         */.